16.20 - 使用上の注意 - Teradata Vantage NewSQL Engine

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

prodname
Teradata Database
Teradata Vantage NewSQL Engine
vrm_release
16.20
category
プログラミング リファレンス
管理
featnum
B035-1210-162K-JPN

Teradata Databaseがテーブル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:customer ID, item ID , ...; repeat;

説明:

  • store numberは、これらの商品を顧客に販売した店です。
  • entriesは、販売した商品の数です。
  • customer IDitem IDによって、各顧客(customer)が購入した商品(item)を表わします。customer IDitem IDはセミコロン ';'で区切り、entriesの回数だけ繰り返されます。
  • 上記の手順が繰り返されることになります。

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