17.05 - CREATE FUNCTIONおよびREPLACE FUNCTION構文要素(テーブル形式) - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 構文規則および例

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
Release Date
2021年1月
Content Type
プログラミング リファレンス
Publication ID
B035-1144-175K-JPN
Language
日本語 (日本)
database_name_1
user_name_1
デフォルト以外のデータベースまたはユーザーで関数を作成または置換する場合に指定する、オプションのデータベース名またはユーザー名。
推奨されているSYSLIBデータベースをUDFの格納先として使用する場合は、その永久領域のサイズを変更し、それに対して適切な権限を付与する必要があります。これは、そのデータベースが永久領域0、アクセス権限なしで作成されているためです。<Teradata Vantage™ - SQLデータ定義言語 - 詳細トピック、B035-1184>を参照してください。
ユーザーには、SYSLIBから実行するすべてのUDFに対するEXECUTE FUNCTION権限が必要です。
データベース名を指定しない場合、システムは現行データベースまたはユーザー内で関数を作成または置換します。
function_name
関数の呼び出し名。
データベース オブジェクトの命名ルールについては、<Teradata Vantage™ - SQLの基本、B035-1141>を参照してください。
これはすべてのテーブルUDFの必須属性です。
function_nameを使用して関数を識別する場合は、その関数が作成されたプログラミング言語の識別子命名ルールに従うように気をつけてください。
名前を二重引用符で囲まない限り、既存のVantage提供の関数(固有関数とも呼ばれる)と同じ名前をテーブルUDFに指定することはできません。 例えば、“TRIM”()などです。 UDFに固有関数の名前を指定することは、望ましくないプログラミング手法なので避けてください。
UDTと、パラメータなしでSYSUDTLIBに格納されているテーブルUDFは、同じ名前を持つことができません。
データベースのUDFライブラリに、名前にマルチバイト文字が存在するオブジェクトが含まれている場合、新規オブジェクト名に1バイト文字のみが含まれる場合でも、1バイト セッション文字セットを使用して、新たなUDF、UDT、メソッド、あるいはJavaストアド プロシージャ オブジェクトを作成することはできません。そうでない場合、Vantageは、要求元にエラーを返し、代わりにマルチバイト セッション文字セットを使用します。
specific_function_nameまたはexternal_function_nameを指定しない場合、function_nameはC、C++、またはJava関数名のスペルと文字の大小に正確に一致している必要があります。同じ注意はJavaテーブル関数用のJava言語の命名ルールにも当てはまります。このルールは関数の定義時だけに当てはまることであり、呼び出し時には当てはまりません。
SQLは同じ関数クラス内の関数名オーバーロードをサポートしているので、function_nameはクラス内で固有である必要はありません。ただし、同じデータベースまたはユーザー内のスカラー関数と集約関数とに同じ名前を指定することはできません。
同じクラス内で同じfunction_nameを持つ別々の関数の識別には、パラメータのデータ型とパラメータの数が使用されます。
関数オーバーロードの詳細については、<Teradata Vantage™ - SQL外部ルーチン プログラミング、B035-1147>を参照してください。
parameter_name
パラメータ名はテーブルUDF定義内で固有でなければなりません。
UDFが受け入れる最大パラメータ数は128です。
関数に渡すパラメータがない場合でも、右括弧と左括弧を指定する必要があります。
data_type
Vantageでは、テーブル関数の入力パラメータでシステム定義のパラメータ型VARIANT_TYPEを使用できます。
テーブル関数の入力パラメータでシステム定義のパラメータ型VARIANT_TYPEを指定するときのルールと制限事項を以下にまとめます。
  • CまたはC++で記述されている外部ルーチンの格納先パラメータのデータ型としてVARIANT_TYPEを指定できます。
  • Javaで記述されている外部ルーチンの格納先パラメータのデータ型としてVARIANT_TYPEを指定することはできません。
UDFでは、最大で128個のパラメータを使用できますが、各VARIANT_TYPE入力パラメータでさらに128個のパラメータに対応できます。最大で8個のUDF入力パラメータをVARIANT_TYPEデータ型として宣言できるので、最大数のVARIANT_TYPEパラメータを指定した場合にVantageで実際に使用できるUDF入力パラメータの数は1,144個になります。
テーブル関数のどのパラメータでも、データ型としてTD_ANYTYPEを指定できます。システム定義のデータ型TD_ANYTYPEでは、あらゆるシステム定義のデータ型を使用できます。その属性は、関数の実行時に決定されます。
TD_ANYTYPEパラメータ データ型の詳細は、<Teradata Vantage™ - データ タイプおよびリテラル、B035-1143>を参照してください。TD_ANYTYPEのメリットを生かしたCルーチンとC++ルーチンのコーディング方法の詳細は、<Teradata Vantage™ - SQL外部ルーチン プログラミング、B035-1147>を参照してください。
入力または結果パラメータにシステム定義のパラメータ型TD_ANYTYPEを指定するときのルールと制限事項を次に示します。
  • C、C++、またはJavaで記述されているスカラー関数、集約関数またはテーブル関数の入力パラメータのデータ型として、TD_ANYTYPEを指定できます。
  • C、C++、またはJavaで記述されているスカラー関数または集約関数の結果パラメータのデータ型として、TD_ANYTYPEを指定できます。
  • テーブル関数の結果パラメータのデータ型として、TD_ANYTYPEを指定することはcannot
文字サーバー データ セットとしてKANJI1を指定することはできません。指定した場合、Vantageはリクエスト元にエラーを返します。
パラメータ データ型BLOBおよびCLOBは、必ずロケータで表わします。逆に、RETURN TABLE句のLOB列データ型はロケータで表わしてはなりません。ロケータの説明については、<Teradata Vantage™ - SQLデータ操作言語、B035-1146>で、USINGリクエスト修飾子についての詳細情報を参照してください。
Vantageではメモリ内LOBパラメータはサポートされません。LOBパラメータごとに、AS LOCATOR句を指定する必要があります。
ただし、データ型変換を必要とするLOBをテーブルUDFに渡すときには、変換を行なうために常にLOBを実体化する必要があります。
パラメータ名を1つ指定する場合は、関数に渡すすべてのパラメータの名前を指定する必要があります。
パラメータ名を指定しない場合、システムはP1P2、…、Pnの形式でパラメータに固有名を割り当てます。 これらの名前はCOMMENT文で使用され、HELP FUNCTION文で生成されるレポートに表示され、エラー メッセージのテキストに表示されます。 COMMENT(コメント配置形式)HELP ONLINEを参照してください。
各パラメータに関連したデータ型は、パラメータまたは戻り値の型です。すべてのVantageのデータ型は有効です。文字データは、CHARACTER SET句も指定できます。
BYTE、CHARACTER、DECIMAL、VARCHARなど、長さやサイズを指定するデータ型では、パラメータのサイズが、渡すことのできる最大バイト数になります。
column_name
関数によって返される行セット内の列の名前。どのテーブル関数定義でも、少なくとも1つの列とそのデータ型を定義する必要があります。
データベース オブジェクトの命名ルールについては、<SQL基礎>を参照してください。
1つのテーブル関数に最大で2,048個の列を指定できます。
指定した列の1つがLOBデータ型の場合、他に少なくとも1つの非LOB列を定義する必要があります。
列名の完全セットとそれに伴うデータ型は、関数が呼び出されたときに呼び出し側に戻すテーブルの構造を定義します。
column_data_type
指定する各列名のデータ型。データ型のリストについては、データ型構文を参照してください。
データ型がCHARACTERファミリーのいずれかの場合は、CHARACTER SET属性も指定できます。
RETURNS句のデータ型としてTD_ANYTYPEを指定することはできません。
文字サーバー データ セットとしてKANJI1を指定することはできません。指定した場合、Vantageはリクエスト元にエラーを返します。
返される列のデータ型がBLOBまたはCLOBのいずれかの場合は、AS LOCATOR句で指定することはできません。そのように指定すると、要求元にエラーが返されます。
これは、AS LOCATOR句で指定しなければならないLOBパラメータのデータ型の指定とは正反対です。
列に対してそのデータ型以外の属性を指定したり、文字データ型に対してCHARACTER SET句を指定することはできません。
maximum_output_columns
呼び出しの前には、関数によって返される出力列の数が不明なため、maximum_output_columns列の最大数に制限します。
上限は、1つのテーブル関数につき2,048列です。
デフォルト値はありません。
database_name_2
user_name_2
任意指定のデータベースまたはユーザーの指定。
function_name
1つのテーブルまたはテーブルの式を入力として受け取り、1つのテーブルを生成します。
明示的な関数名の指定はオプションです。
language_clause
外部関数の記述に使用するプログラミング言語を表わすコード。
コード 意味
C 外部関数がオブジェクト形式の場合も、外部関数はCで記述されます。
CPP 外部関数がオブジェクト形式の場合も、外部関数はC++で記述されます。
JAVA 外部関数は、Javaで記述されます。
SAS 外部関数は、SQLTABLEパラメータ形式を使用する必要があるSASで記述されています。
これはすべてのUDFの必須属性です。
外部UDFの作成に有効な言語はC、C++、およびJavaです。
外部関数オブジェクトがC、C++、またはJavaで作成されていない場合は、そのオブジェクトがC、C++、またはJavaオブジェクト コード互換である必要があります。
Teradata Vantage™ - SQLデータ定義言語 - 詳細トピック、B035-1184を参照してください。
SQL_data_access
外部関数本体がデータベースにアクセスするか、またはSQL文を含んでいるかを指定します。
この句はすべてのテーブルUDFで必須であり、NO SQLとして指定する必要があります。

function_attribute

database_name_3
user_name_3
オプションのデータベースまたはユーザー名。
specific_function_name
関数の特定の名前。
データベースのUDFライブラリに、名前にマルチバイト文字が存在するオブジェクトが含まれている場合、新規オブジェクト名に1バイト文字のみが含まれる場合でも、1バイト セッション文字セットを使用して、新たなUDF、UDT、メソッド、あるいはJavaストアド プロシージャ オブジェクトを作成することはできません。そうでない場合、Vantageは、要求元にエラーを返し、代わりにマルチバイト セッション文字セットを使用します。
データベース オブジェクトの命名ルールについては、<Teradata Vantage™ - SQLの基本、B035-1141>を参照してください。
この句はオーバーロード関数の名前では必須ですが、その他の場合は任意指定であり、関数定義ごとに1回だけ指定できます。
specific_function_nameを使用してCまたはC++関数名を識別する場合は、C言語またはC++言語の識別子命名規則に従ってください。Java関数用のJava言語の命名規則についても同様です。
specific_function_namefunction_nameとは異なり、名前の重複を回避するために、データベースまたはユーザー内で固有でなければなりません。
この名前はDBC.TVMに、UDFデータベース オブジェクトの名前として保存されます。
PARAMETER STYLE
テーブル関数にパラメータを渡すときに使用するパラメータの受け渡し表記。
指定するパラメータ形式は、外部関数のパラメータを渡すための表記と一致していなければなりません。
この句は、SQLテーブル関数に対してオプションで、関数定義ごとに1回だけ指定できます。この句は、Javaテーブル関数に対して必須です。
この時点でパラメータ形式を指定しない場合は、パラメータ形式を外部本体の参照と共に指定できます。
同じCREATE/REPLACE FUNCTIONリクエストで複数のパラメータ形式を指定することはできません。
テーブル関数を使用して、行レベル セキュリティをセキュリティ制約に適用することはできません。
UDFパラメータ形式の詳細については、<Teradata Vantage™ - SQLデータ定義言語 - 詳細トピック、B035-1184>を参照してください。
SQL
標識変数を使用して引数を渡します。
その結果、NULLを入力として渡して結果として返すことが常に可能になります。
SQLがデフォルトのパラメータ形式です。
JAVA
すべてのJavaテーブル関数で必須です。
Java関数がNULL引数を受け入れる必要がある場合、EXTERNAL NAME句にはパラメータのリストを含め、Javaオブジェクトにマップするデータ型を指定する必要があります。
DETERMINISTIC
関数が同一の入力に対して同一の結果を返すかどうかを指定します。
この句は任意指定であり、関数定義ごとに1回だけ指定できます。
NOT DETERMINISTIC
例えば、関数が処理の一部として乱数生成機能を呼び出す場合、関数呼び出しの結果は呼び出す前に判明しないので、その関数はNOT DETERMINISTICになります。
デフォルト値はNOT DETERMINISTICです。
CALLED ON NULL INPUT
関数の呼び出し時にパラメータがNULLであってもなくても、関数を常に評価します。
この句は任意指定であり、関数定義ごとに1回だけ指定できます。
GLOP_set_name
このテーブル関数が関連付けられたGLOPセットの名前。
データベース オブジェクトの命名ルールについては、<Teradata Vantage™ - SQLの基本、B035-1141>を参照してください。
指定したGLOPセットは、テーブル関数を作成している時点で存在している必要はありません。
この句は、RETURNS句とEXTERNAL句の間の任意の場所に指定できます。
EXTERNAL
外部関数本体の参照句を示します。
この句はすべてのテーブルUDFで必須です。
この句によって、以下の4種類の指定ができます。
  • キーワードEXTERNALのみ。
  • キーワードEXTERNAL NAMEおよび外部関数名(オプションのパラメータ形式の指定あり)。

    これはすべてのUDFの必須属性です。

  • キーワードEXTERNAL NAMEおよび外部文字列リテラルのセット。
  • キーワードEXTERNAL NAMEおよびJava JAR IDの指定。
external_function_name
関数オブジェクトのエントリ ポイント。最大30文字。
データベース オブジェクトの命名ルールについては、<Teradata Vantage™ - SQLの基本、B035-1141>を参照してください。
文字の大小は有意であり、C、C++、またはJava関数名と一致していなければなりません。
external_string_literal
テーブル関数の作成に必要なソース コンポーネントとオブジェクト コンポーネントの格納場所を指定する文字列。
詳細については、<Teradata Vantage™ - SQLデータ定義言語 - 詳細トピック、B035-1184>を参照してください。

code_specification

単一の文字コード。シーケンス内の最初のコードに応じて、この文字列では、UDFのテーブル関数オブジェクト名、エンコード名、またはテーブル関数の作成に必要なコンポーネントのパスを指定します。

F
関数オブジェクト。後続の文字列は、CまたはC++のテーブル関数オブジェクトのエントリ ポイント名です。
F!function_entry_point_name
C
クライアント。テーブル関数のソース コードまたはオブジェクト コードは、クライアントに格納されます。
S
サーバー。 テーブル関数のソース コードまたはオブジェクト コードは、サーバーに格納されます。

path_specification

次のリストに、外部テーブル関数のパス指定を示します。オプションは、パッケージ オプションを除いて必要に応じて何度でも繰り返すことができます。外部文字列リテラルとして以下のファイル タイプを指定できます。

I
インクルード ファイル(.h)。
I!name_on_server!include_name
L
UDFで必要な非標準のライブラリ ファイルのライブラリ名。
L!library_name
O
オブジェクト ファイル。
O!name_on_server!object_name
P
パッケージ名。このパッケージ オプションは、FのC関数名オプションを除き、他のすべてのオプションとは併用できません。
P!package_name
S
ソース ファイル。
S!name_on_server!source_name
NS
ソース ファイルなし。ソース ファイルおよびインクルード ファイルは、関数テーブルに格納されません。このオプションは、新しい関数の作成でソース コードを処理する方法、および外部文字列リテラルに指定されたすべてのソース コードに適用する方法に影響を与えます。
NS!source_file!include_file
delimiter
区切り文字(!など)を指定します。文字列の指定の全体で、同じ区切り記号を使用しなければなりません。
name_on_server
サーバー上のファイルに名前を付けます。インクルード ファイルには、Cソース内のinclude文で指定された名前と同じ名前(拡張子なし)が付いている必要があります。
file_pathname
ソース、インクルード ファイル、オブジェクト、またはライブラリの格納場所(パス)と名前。パッケージおよびライブラリをプリインストールする必要があるため、サーバー オプション(S)を使用する必要があります。パス指定では、関数がUnixプラットフォームまたはWindowsプラットフォームのいずれで作成されているかに関係なく、前方スラッシュ(/)または円記号(\)を使用できます。

JAR_ID_specification

次に示す変数は、Javaテーブル関数にのみ適用されます。

JAR_ID
この関数に関連付けられているJARファイルの登録名。
java_class_name
実行するJavaメソッドを格納するJARに含まれるJavaクラスの名前。
method_name
UDFを実行するときに実行されるメソッドの名前。
データベース オブジェクトの命名ルールについては、<SQL基礎>を参照してください。

java_parameter_class

primitive
次のいずれかのプリミティブ パラメータ クラス。
  • バイト
  • double
  • int
  • long
  • short
object
次の形式のオブジェクト パラメータ クラス定義。
java.pkg.class
EXTERNAL SECURITY
外部セキュリティ句の前に指定するキーワード。
この句はオペレーティング システムI/Oを実行する外部UDFで必須です。
外部セキュリティ句を指定しないのに、定義されているUDFがOS I/Oを実行する場合、そのI/Oの結果は予期不能です。最も考えられる結果はデータベースのクラッシュで、システム全体がクラッシュする場合もあります。
外部ルーチンの許可を作成する方法の詳細については、CREATE AUTHORIZATIONおよびREPLACE AUTHORIZATIONを参照してください。
DEFINER
UDFが関連するセキュリティ許可オブジェクトのクライアント ユーザー コンテキストで実行することを指定します。このオブジェクトはこの目的のために作成されたもので、テーブル関数と同じデータベースに収められています。
  • 許可名を指定する場合は、テーブル関数を呼び出す前にその名前で許可オブジェクトを定義する必要があります。
  • 許可名を指定しない場合は、デフォルトのDEFINER許可オブジェクトを定義する必要があります。
デフォルトの許可オブジェクトは、ユーザーがテーブル関数を実行する前に定義しておく必要があります。
指定された許可名がUDFの作成時に存在しない場合は、許可名が存在しないことを示す警告がVantageにより報告されます。
それでもテーブル関数を実行しようとすると、リクエストはアボートし、Vantageは要求元にエラーを返します。
authorization_name
オプションの許可名。
データベース オブジェクトの命名ルールについては、<Teradata Vantage™ - SQLの基本、B035-1141>を参照してください。
指定した許可オブジェクトはあらかじめ定義しておく必要があります。定義されていない場合システムはエラーを報告します。詳細については、CREATE AUTHORIZATIONおよびREPLACE AUTHORIZATIONを参照してください。
INVOKER
この目的で存在するデフォルトの許可オブジェクトに関連したOSユーザー コンテキストでテーブル関数が実行されることを指定します。
CREATE AUTHORIZATIONおよびREPLACE AUTHORIZATIONを参照してください。
EXECUTE MAP
連続マップまたはスパース マップ、また、必要に応じて、テーブル演算子の実行にコロケーション名を指定します。テーブル演算子は、マップ内のAMPでのみ実行されます。
このマップを上書きするには、テーブル演算子を実行するSELECT文のFROM句のEXECUTE MAP句を指定します。<Teradata Vantage™ - SQLデータ操作言語、B035-1146>を参照してください。
指定されたマップが許可されている必要があります。
map_name
連続マップまたはスパース マップの名前。
TD_DataDictonaryMapまたはTD_GlobalMapを指定することはできません。
colocation_name
他の関数、テーブル、結合インデックス、またはハッシュ インデックスと同じAMP上の関数を共同設置するために指定します。
このオプションは、スパース マップに対してのみ指定できます。連続マップの場合、colocation_nameはNULLに設定されます。
コロケーション名を指定しない場合、名前はデフォルトでdatabase_functionになります。databaseはデータベースまたはユーザーの名前、その後に下線(_)が続き、functionはユーザー定義関数の名前です。databaseが63文字を超える場合、databaseは63文字に切り捨てられます。functionが64文字を超える場合、functionは64文字に切り捨てられます。