関数の呼び出し名。
データベース オブジェクトの命名ルールについては、<Teradata Vantage™ SQL基礎、B035-1141>を参照してください。
これはすべてのテーブルUDFの必須属性です。
function_nameを使用して関数を識別する場合は、その関数が作成されたプログラミング言語の識別子命名ルールに従うように気をつけてください。
名前を二重引用符で囲まない限り、既存のTeradata Database提供の関数(固有関数とも呼ばれる)と同じ名前をテーブルUDFに指定することはできません。 例えば、“TRIM”()などです。 UDFに固有関数の名前を指定することは、望ましくないプログラミング手法なので避けてください。
UDTと、パラメータなしでSYSUDTLIBに格納されているテーブルUDFは、同じ名前を持つことができません。
specific_function_nameまたはexternal_function_nameを指定しない場合、function_nameはC、C++、またはJava関数名のスペルと文字の大小に正確に一致している必要があります。同じ注意はJavaテーブル関数用のJava言語の命名ルールにも当てはまります。このルールは関数の定義時だけに当てはまることであり、呼び出し時には当てはまりません。
SQLは同じ関数クラス内の関数名オーバーロードをサポートしているので、function_nameはクラス内で固有である必要はありません。ただし、同じデータベースまたはユーザー内のスカラー関数と集約関数とに同じ名前を指定することはできません。
同じクラス内で同じfunction_nameを持つ別々の関数の識別には、パラメータのデータ型とパラメータの数が使用されます。
関数オーバーロードの詳細については、<Teradata Vantage™ SQL外部ルーチン プログラミング、B035-1147>を参照してください。
- database_name
- user_name
- デフォルト以外のデータベースまたはユーザーで関数を作成または置換する場合に指定する、オプションのデータベース名またはユーザー名。
例: 入力引数からの関数の作成
この例は、SELECTリクエストのFROM句内の前回の相関subquery(表示されない)からの入力に基づいて変数の入力引数を取り込みます。関数定義はXMLテキストを入力しますが、これは後に構文解析され、顧客ID、店番号、および購入される品物のセットが抽出されます。出力からは購入される品物につき1行と、関数定義で定義された表内の既存の列に基づく列が生成されます。
CREATE FUNCTION xml_extract( xml_text VARCHAR(64000)) RETURNS TABLE (cust_id INTEGER, store INTEGER, item INTEGER) LANGUAGE C NO SQL EXTERNAL;
例: XML関数の作成および使用
以下のテーブル関数の定義があるとします。
CREATE FUNCTION xml_extract( xml_text LOCATOR CLOB) RETURNS TABLE (cust_id INTEGER, store INTEGER, item INTEGER) LANGUAGE C NO SQL EXTERNAL;
この関数は、Webアプリケーションによって特定の顧客が特定の店から注文したすべての品物をCLOB xml_textから抽出します。その後、注文された各品物ごとに1つの結果行を生成します。
XMLデータはすでにデータベース テーブルにあります。このテーブルは次のように定義されています。
CREATE TABLE xml_tbl ( store_no INTEGER, refnum INTEGER, xml_store_text CLOB) UNIQUE PRIMARY INDEX (store_no, refnum);
- テーブルxml_tblには次の列が含まれます。
- 店番号の列store_no。
- 参照番号の列refnum。
- XMLテキストの列xml_store_text。
- xml_store_text列には、店に対してWebに基づく品物を注文した顧客に関するXML形式のテキストが入ります。
- それぞれのXMLテキスト データの列には、注文を行なった顧客とその顧客が注文した品物に関する情報が入ります。
テーブル関数の目的は、顧客が注文したすべての品物をXML文書から抽出することです。オンラインのWebベースのシステムによって行なわれる各注文ごとに1つのXML行が作成されます。XMLテキストはいくつかの品物によって構成される場合があるので、テーブル関数は、注文される品物ごとに1つの行を抽出するようなデータ抽出のための自然なアプローチです。XMLテキストに10個の品物がある場合、テーブル関数は10行のテーブルを返します。
次のSELECTリクエストは、xml_extractテーブル関数の応用例です。
SELECT l.customer_id l.store, l.item, FROM (SELECT xml_store_text FROM xml_tbl AS x WHERE store_no = 25), TABLE(xml_extract(x.xml_text_store)) AS l (cust_id,store,item);
このSELECTリクエストは、すべての顧客が店25から購入した品物ごとに1つの行を生成します。その最初の派生テーブルは、店番号25を持つすべての行からXMLのテスト フィールドを生成します。2番目の派生テーブルは、テーブル関数xml_extractの評価結果です。
SELECT操作の後の論理プロセスは次のとおりです。
- テーブルの相関名がxの、FROM句の最初のsubqueryから最初の派生テーブルを作成します。
- テーブル関数を評価します。
関数は、派生テーブルの列x.xml_text_storeを参照する入力引数を持ちます。テーブルxによって作成された各行に対して、データベースがテーブル関数をループで繰り返し呼び出す必要があります。ループはテーブル関数によって「no more data」というメッセージが返されると終了します。
ループの後に次のプロセスが続きます。
- 表xの行を読み取ります。ここで、store_no = 25です。
- そのような行が検出されるかどうかを判別します。
一致する行の検索結果 結果 検出される場合 処理を継続します。 検出されない場合 処理を停止します。 - テーブル関数xml_extract (x.xml_text_store)を呼び出します。
- 処理データが他にもあるかどうか判別します。
呼び出し 結果 SQLSTATEコード'02000'を返さない (以後のデータなし)
処理を継続します。 SQLSTATEコード'02000'を返す プロセス完了。 - xml_extractテーブル関数によって生成される新しい行を書き込みます。
- ステップcに進みます。
- 結果を要求元に返します。
Teradata Databaseは、この問題を解決するときに次のプロセスを実行します。
- システムは、派生テーブルSELECTリクエストによって入力として生成されるx.xml_text_store結果をテーブル関数xml_extractに渡します。
- システムは、同じ行に対して繰り返しテーブル関数を呼び出します。
テーブル関数が呼び出されるたびに、cust_id、store、およびitemの列を含む行が生成されます。
- テーブル関数がそのxml_text_store CLOBからのすべてのデータを使い果たしたら、SQLSTATE "no data"('02000')を返します。
- この"no more data"という結果が返されると、最初の派生テーブルによって生成された次の行の読み取りがシステムによって行なわれます。
- システムは別の顧客に対してプロセスを繰り返し、さらに次のxml_text_storeに関する行を生成します。
例: 定数参照テーブル関数
この例は、別のテーブルに等価結合される定数参照テーブル関数を示しています。
- テーブル関数は同じ定数データとともに全AMPに送信されるので、これは定数モードのテーブル関数です(<Teradata Vantage™ SQL外部ルーチン プログラミング、B035-1147>の「定数モードのテーブル関数の本体」を参照)。
- テーブル関数tudf1は、選択したすべての行を生成します。
その後、WHERE条件は生成された中からサブセットを選択します。要求元には条件に合う行のみが返されます。
SELECT * FROM tbl_1, TABLE(tudf1(28.8, 109)) AS tf2 WHERE tbl_1.c1 = tf2.c1;
例: 変数参照テーブル関数
この例は、別のテーブルに等価結合される変数参照テーブル関数を示しています。
- テーブル関数はすべてのAMPに送信され、tbl1のすべての行からのtbl.c1が渡されます。したがって、これは変数モードのテーブル関数です(<Teradata Vantage™ SQL外部ルーチン プログラミング、B035-1147>の「変数モードのテーブル関数の本体」を参照)。
- このテーブル関数の設計者は、「等価」条件が満たされない場合に行をまったく生成しないことによって関数にいくらかの判断機能があることを示すために、3つ目の引数を追加しました。例えば、入力引数tbl_l.c1と値tf2.c1の行が等しくない場合、関数は行を生成しません。このコードによって、WHERE句条件の結果としてテーブル関数により生成される行をフィルタ処理するという後続のステップは不要になります。
SELECT * FROM tbl_1, TABLE(tudf1(28.8, tbl_1.c1, 'equal')) AS tf2 WHERE tbl_1.c1 = tf2.c1;