17.10 - 使用上の注意 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQL演算子およびユーザー定義関数

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
管理
Publication ID
B035-1210-171K-JPN
Language
日本語 (日本)

VantageがテーブルUDF式を評価するとき、1度のループで1行ずつのテーブルをSELECT文に返すテーブル関数を呼び出します。この関数は、渡された入力引数、または外部ファイルあるいはメッセージ キューの読み取りに基づいて、テーブルの行を生成できます。

テーブル関数では、128個の入力パラメータを用意することができます。 テーブル関数呼び出しの引数に適用されるルールは、スカラー関数呼び出しに適用されるルールと同じです。 UDF引数を参照してください。

テーブルUDFには戻り値がありません。作成される結果の行の列は、出力パラメータとして返されます。

テーブル関数の出力パラメータは、CREATE FUNCTION文のRETURNS TABLE句で定義します。出力パラメータの数は、通常のテーブルに定義できる列の最大数によって制限されます。

出力パラメータの数とデータ型は、CREATE FUNCTION文で静的に指定することも、実行時にテーブル関数を呼び出すSELECT文で動的に指定することもできます。

AMPがダウンしている場合には、フォールバック データに対してテーブル関数およびテーブル演算子を実行できません。AMPが復帰したら、問合わせは通常どおり完了できます。

この例では、extract_fieldテーブルUDFを使用して、raw_custテーブルのpending_data列からcustomer IDstore number、およびitem IDを抽出します。

raw_custテーブルの定義

CREATE SET TABLE raw_cust ,NO FALLBACK ,
   NO BEFORE JOURNAL,
   NO AFTER JOURNAL,
   CHECKSUM = DEFAULT
   (
    region INTEGER,
    pending_data VARCHAR(32000) CHARACTER SET LATIN NOT CASESPECIFIC)
PRIMARY INDEX (region);

pending_dataテキスト フィールドは、書式を指定された数の文字列です。

store_number,entries:entry[;...]
entry
customer_ID,item_ID
store_number
商品を顧客に販売した店を識別する数。
entries
販売された商品の数。
customer_ID
顧客ID。
item_ID
商品ID。

raw_custテーブルからのサンプル データを以下に示します。

  region  pending_data
--------  ---------------------------------------------------------
       2  7,2:879,3788,879,4500;08,2:500,9056,390,9004;
       1  25,3:9005,3789,9004,4907,398,9004;36,2:738,9387,738,9550;
       1  25,2:9005,7896,9004,7839;36,1:737,9387;

extract_fieldテーブルUDFのSQL定義を以下に示します。

CREATE FUNCTION extract_field (Text VARCHAR(32000),
                               From_Store INTEGER)
RETURNS TABLE (Customer_ID INTEGER,
               Store_ID INTEGER,
               Item_ID INTEGER)
LANGUAGE C
NO SQL
PARAMETER STYLE SQL
EXTERNAL NAME extract_field;

次の問合わせでは、地域(region) 1の店(store) 25から購入した顧客と商品を抽出して表示します。

SELECT DISTINCT cust.Customer_ID, cust.Item_ID
FROM raw_cust,
TABLE (extract_field(raw_cust.pending_data, 25))
AS cust
WHERE raw_cust.region = 1;

このSELECT文の出力は、次のようになります。

Customer_ID       Item_ID
------------  -----------
        9005         3789
        9004         4907
         398         9004
        9005         7896
        9004         7839