17.00 - 17.05 - コントラクト関数 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQL外部ルーチン プログラミング

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Published
2020年6月
Content Type
プログラミング リファレンス
Publication ID
B035-1147-170K-JPN
Language
日本語 (日本)

テーブル演算子の出力テーブルの行形式を決定するユーザー定義コントラクト関数を作成できます。テーブル演算子が構文解析される場合、コントラクト関数が実行時に呼び出されます。

コントラクト関数は、標準スカラーUDFに似ています。この関数は入力パラメータを受け取らず、成功または失敗を示す整数を戻します。

コントラクト関数はFNC関数を使用してテーブル演算子入力情報にアクセスし、FNC関数を使用して戻りの行形式を設定することができます。テーブル演算子は関数コンテキストにアクセスできます。

コントラクト関数は、FNC関数を使用して、以下のメタデータにアクセスできます。
  • 列数、データ型、および名前情報などの入力パラメータ メタデータ。
  • 列数、データ型、および名前情報などの明示的に定義された出力行メタデータ。
  • 呼び出される関数の名前。
  • オプションのカスタム句に関連するメタデータ。
  • オプションのHASH BY句に関するメタデータ。
  • オプションのLOCAL ORDER BY句に関するメタデータ。
コントラクト関数はFNC関数を使用して、テーブル演算子に関連する以下のメタデータを設定することができます。
  • 列数、データ型、および名前情報などの出力パラメータ メタデータ。
  • 契約時に作成され実行時にテーブル演算子に渡されるオプションの構造体。
  • 行とフィールド形式のオプション指定。
  • HASH BY句のオプション指定。
  • LOCAL ORDER BY句のオプション指定。

コントラクト関数が使用できるFNC関数の詳細に関しては、テーブル演算子インターフェースを参照してください。

CREATE FUNCTION文のRETURNS TABLE句を使用することにより、コントラクト関数をテーブル演算子と関連付けます。

例えば、以下のように定義されたテーブル演算子があると仮定します。

void udaggregation ()
{
     ...
}

また以下のように定義されたコントラクト関数があると仮定します。

void udaggregation_contract (
   INTEGER *result,
   int *indicator_Result,
   char sqlstate[6],
   SQL_TEXT extname[129],
   SQL_TEXT specific_name[129],
   SQL_TEXT error_message[257])
{
     ...
}

この場合、テーブル演算子のSQL定義のRETURNS TABLE句で、コントラクト関数名を以下のように指定することにより、コントラクト関数をテーブル演算子に関連付けます。

REPLACE FUNCTION udaggregation ()
   RETURNS TABLE VARYING USING FUNCTION udaggregation_contract
   LANGUAGE C
   NO SQL
   PARAMETER STYLE SQLTABLE
   EXTERNAL NAME 'CS!udaggregation!udaggregation.c!F!udaggregation';
テーブル演算子のコードとコントラクト関数のコードが別々のソースファイルにある場合、CREATE FUNCTION文は両方のソースファイルを参照する必要があります。

コントラクト関数名の最大長は、CHAR(30) CHARACTER SET LATINです。文字列がデータ ディクショナリに保存するためにLATINに変換された後、コントラクト関数名がこの制限を超えると、CREATE FUNCTION文はエラーになります。

ひとたび作成した後は、コントラクト関数は直接削除できません。テーブル演算子を削除する場合、コントラクト関数も削除されます。同様に、コントラクト関数は直接変更できません。テーブル演算子を変更して異なるモードで実行する場合には、コントラクト関数も変更されます。テーブル演算子を再コンパイルする場合、コントラクト関数も再コンパイルされます。

テーブル演算子またはコントラクト関数は、名前を変更できません。

テーブル演算子およびコントラクト関数のCコードの例については、C テーブル演算子を参照してください。