17.00 - 17.05 - メソッドの機能 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 詳細トピック

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Release Date
2020年6月
Content Type
プログラミング リファレンス
Publication ID
B035-1184-170K-JPN
Language
日本語 (日本)
ユーザー定義メソッド(メソッドまたはUDMとも呼ばれる)は、次の特性を持つ特殊UDFです。
  • 特定のUDTと一意的に関連付けられる。
  • 常にSYSUDTLIBデータベース内に作成される。
  • ドット表記を使って呼び出される(udt_expression.method(...)の形式)(詳細は、<Teradata Vantage™ - SQL演算子およびユーザー定義関数、B035-1210>を参照)。
  • CまたはC++のいずれかで作成可能(詳細については、<Teradata Vantage™- SQL外部ルーチン プログラミング、B035-1147>を参照)。

メソッドは、そのCREATE TYPE文(メソッド定義はCREATE METHOD定義とCREATE TYPE定義に分けられるCREATE TYPE (DISTINCT形式)およびCREATE TYPE (STRUCTURED形式)を参照)によって指定されるUDT定義の一部、またCREATE METHODを使用する個別のメソッド本体として定義する必要があります。CREATE METHOD文によって行なわれる定義ではメソッドが実際に宣言され、必要な場合にはそのEXTERNAL NAME定義およびEXTERNAL SECURITY定義も宣言されます。

ALTER TYPE文(ALTER TYPEを参照)を使って、新しく定義されるメソッドのシグネチャを型定義に追加することも、既存のメソッドのシグネチャを削除することもできます。

それぞれのメソッドにはシグネチャが関連付けられています。これは、そのメソッド名およびその宣言済みパラメータ リストとして定義されます。メソッドのシグネチャは、指定UDTのCREATE TYPE文(CREATE TYPE (DISTINCT形式)およびCREATE TYPE (STRUCTURED形式)を参照)、またはALTER TYPE文で作成される型再定義で指定されたメソッド シグネチャの1つと一致していなければなりません。

つまり、次の文がTRUEになるようにメソッド シグネチャをUDTと関連付ける必要があります。
  • そのメソッド名が同じである。
  • そのパラメータ リストが同じである。
  • メソッドをCONSTRUCTOR型として定義する場合、メソッド シグネチャにもCONSTRUCTORキーワードが含まれており、それに関連したUDTはSTRUCTURED型にならなければなりません。

宣言済みパラメータ リストとは、それに関連したCREATE TYPE文のメソッド指定で指定されるリストのことです。システムはそれぞれのメソッドごとに内部的に追加パラメータ リストを生成します。追加パラメータ リストは、最初のパラメータとして関連UDT名またはサブジェクト パラメータを持ち、2番目のパラメータとして宣言済みパラメータ リストを持ちます。それらが組み合わされて追加パラメータ リストを形成します。

例えば、以下のudt_nameというUDTのメソッド指定を考えてみましょう。

    CREATE TYPE udt_name
     …
     CONSTRUCTOR METHOD udt_name(CP1, CP2, …) …,
     INSTANCE METHOD M1(MP1, MP2, …) …,
     … ;

次の表は、これらのメソッドの宣言済みパラメータ リストと追加パラメータ リストを説明しています。

メソッド 宣言済みパラメータ リスト 追加パラメータ リスト
コンストラクタ (CP1, CP2, …) (udt_name, CP1, CP2, …)
インスタンス (MP1, MP2, …) (udt_name, MP1, MP2, …)

追加パラメータ リストは、CREATE TYPE文またはALTER TYPE文で指定されるメソッドと、既存のメソッドおよびUDFとの間に矛盾がないかどうかを調べるために使用されます。さらに、追加パラメータ リストはメソッド解決プロセスでも使用されます。

メソッド パラメータに対して、LOB、UDT、TD_ANYTYPE、およびVARIANT_TYPEを含む任意のデータ型を宣言することができます。

VARIANT_TYPEデータ型を持つように宣言できるのは入力パラメータのみですが、TD_ANYTYPEデータ型についてはすべてのメソッド パラメータに宣言できます。メソッドの開発の詳細について、<Teradata Vantage™- SQL外部ルーチン プログラミング、B035-1147>を参照してください。

メソッドは、名前のオーバーロードと、サーバー文字セットまたは精度のオーバーロードの両方をサポートします。1つのUDTの複数のメソッドは、そのパラメータ リストが異なる限り、同じメソッド名を持つことができます。文字セットおよび制度のオーバーロードは、パラメータのTD_ANYTYPEデータ型および戻り型を使用することによってサポートされます。

TD_ANYTYPEをパラメータ データ型として使用し、メソッドを定義することによって、その名前ではなくサーバー文字セットまたは数値の精度に基づいてメソッドをオーバーロードできます。TD_ANYTYPEを使用してメソッドを定義するとき、データベースは、提供されるパラメータに基づき、実行時にパラメータ データ型を判別します。

TD_ANYTYPEを未判別の属性を持つパラメータ データ型のタイプの別名として使用できるだけでなく、TD_ANYTYPEを使用してすべての可能なパラメータ データ型を解釈できます。これにより、同じ基本メソッドに対して開発する関数シグネチャの数が少なくなるだけでなく、必要なメソッドの動作のロジックを柔軟にコーディングできます。

ただし、パラメータ データ型としてTD_ANYTYPEを使用すると、入力値をメソッド シグネチャに一致する値に自動的に変換する暗黙的な変換が失われます。そのため、未定義のパラメータが適切に解釈されて処理されていることを必ず確認する必要があります。