CREATE METHOD ステートメント
CREATE METHOD ステートメントは、既にユーザー定義の構造化タイプの定義の一部となっているメソッド指定に、メソッド本体を関連付けるために使用されます。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。
許可
- メソッドの暗黙的または明示的なスキーマ名が存在しない場合は、データベースに対する IMPLICIT_SCHEMA 権限。
- スキーマに対する CREATEIN 特権 (メソッドのスキーマ名が既存のスキーマを指している場合)。
- スキーマに対する SCHEMAADM 権限 (メソッドのスキーマ名が既存のスキーマを参照する場合)。
- DBADM 権限。
- データベースに対する CREATE_EXTERNAL_ROUTINE 権限。
- SYSADM 権限
- DB2_ALTERNATE_AUTHZ_BEHAVIOUR レジストリー変数が設定されていて、値 EXTERNAL_ROUTINE_DBADM が含まれている場合は、DBADM 権限。注: Db2 11.5.8 セキュリティー特殊ビルド 29133 には、SYSADM 権限と DBADM 権限の両方の暗黙権限に対する変更が含まれています。 デフォルトでは、SYSADM 権限は、DBADM 権限ではなく、暗黙的に CREATE_EXTERNAL_ROUTINE 権限と CREATE_NOT_FENCED_ROUTINE 権限を持ちます。 DB2_ALTERNATE_AUTHZ_BEHAVIOUR レジストリー変数が設定されていて、EXTERNAL_ROUTINE_DBADM または NOT_FENCED_ROUTINE_DBADM のいずれかの値が含まれている場合、DBADM 権限も暗黙的にこれらの特権を持ちます。
PUBLIC 以外のグループ特権は、 CREATE METHOD ステートメントで指定された表やビューに対しては考慮されません。
このニックネームで示されている表またはビューのデータ・ソースの許可要件は、 メソッドが呼び出される時に適用されます。 接続の許可 ID は、別のリモート許可 ID へマップできます。
構文
- 1 The compound SQL (inlined) statement is only supported for an SQL-method-body in an SQL method definition in a non-partitioned database.
説明
- METHOD
- ユーザー定義の構造化タイプに関連付けられる既存のメソッド指定を識別します。 メソッド指定は、以下のいずれかの方法で識別できます。
- メソッド名
- メソッド本体に対して定義するメソッド指定の名前を指定します。 暗黙的スキーマは、サブジェクト・タイプ (type-name) のスキーマです。 この method-name のある type-name には、 1 つしかメソッドを指定できません (SQLSTATE 42725)。
- method-signature
- 定義するメソッドを一意的に識別できるメソッド・シグニチャーを指定します。 このメソッド・シグニチャーは、
CREATE TYPE または ALTER TYPE ステートメントで提供されたメソッド指定と一致しなければなりません (SQLSTATE 42883)。
- メソッド名
- メソッド本体に対して定義するメソッド指定の名前を指定します。 暗黙的スキーマは、サブジェクト・タイプ (type-name) のスキーマです。
- parameter-name
- パラメーター名を指定します。 パラメーター名がメソッド・シグニチャーにより提供される場合、 これらは適合するメソッド指定の対応する部分と全く同じでなければなりません。 このステートメントでは、文書化だけのためにパラメーター名がサポートされています。 data-type1
- 各パラメーターのデータ・タイプを指定します。 配列タイプはサポートされません (SQLSTATE 42815)。
各組み込みデータ・タイプの詳細な説明については、
CREATE TABLE
を参照してください。文字データ・タイプおよびグラフィック・ストリング・データ・タイプでは、CODEUNITS32 のストリング単位を指定することはできません。
- AS LOCATOR
- LOB タイプまたは LOB タイプに基づく特殊タイプの場合、 AS LOCATOR 節を追加することができます。
- RETURNS
- この節は、メソッドの出力を指定します。 RETURNS 節がメソッド・シグニチャーにより提供される場合、
これは CREATE TYPE の対応するメソッド指定の対応する部分と全く同じでなければなりません。 このステートメントでは、文書化だけのために RETURN 節がサポートされています。
- data-type2
- 出力のデータ・タイプを指定します。 配列タイプはサポートされません (SQLSTATE 42815)。
- AS LOCATOR
- LOB タイプまたは LOB タイプに基づく特殊タイプの場合、 AS LOCATOR 節を追加することができます。 これは、実際の値の代わりに LOB ロケーターが、メソッドにより戻されることを指定します。
- data-type3CAST FROMdata-type4
- この形式の RETURNS 節は、
関数コードから戻されたデータ・タイプとは異なるデータ・タイプを、
呼び出しステートメントに戻すのに使用されます。
- AS LOCATOR
- LOB タイプまたは LOB タイプに基づく特殊タイプの場合、AS LOCATOR 節を使用して、 LOB ロケーターが実際の値の代わりにメソッドから戻されるように指定できます。
- 出力のデータ・タイプを指定します。 配列タイプはサポートされません (SQLSTATE 42815)。
- メソッド本体に対して定義するメソッド指定の名前を指定します。 暗黙的スキーマは、サブジェクト・タイプ (type-name) のスキーマです。
- FOR タイプ名
- 指定されたメソッドを関連付けるタイプを指定します。 ここで指定される名前は、 カタログに既に記述されているタイプを示すものでなければなりません (SQLSTATE 42704)。 動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターが、 修飾子のないオブジェクト名の修飾子として使用されます。 静的 SQL ステートメントでは、QUALIFIER プリコンパイル/BIND オプションにより、 修飾子のないオブジェクト名の修飾子が暗黙指定されます。
- SPECIFIC METHOD 特定名
- CREATE TYPE 時に指定されたか、デフォルト値として与えられた値を使用して、 特定のメソッドを識別します。 specific-name は、指定したスキーマまたは暗黙のスキーマのメソッド指定を識別しなければなりません。 そうでない場合、エラーになります (SQLSTATE 42704)。
- EXTERNAL
- この節は、この CREATE METHOD ステートメントを使用して登録するメソッドが、
外部プログラミング言語で作成されたコードに基づいており、
文書化されたリンケージの規則とインターフェースに従っていることを示します。 CREATE TYPE で適合するメソッド指定は、SQL 以外の LANGUAGE を指定しなければなりません。 このメソッドが呼び出されると、メソッドのサブジェクトが、
暗黙の最初のパラメーターとしてインプリメンテーションに渡されます。
NAME 文節が指定されていない場合は、
NAME method-name
が想定されます。- 名前
- この節は、定義するメソッドをインプリメントするユーザー作成コードの名前を指定します。
- 'string'
- string オプションは、最大 254 バイトのストリング定数です。 ストリングに使用される形式は、指定した LANGUAGE によって異なります。 特定の言語規則について詳しくは、
CREATE FUNCTION (外部スカラー) ステートメント
を参照してください。 ID - 指定する identifier は SQL ID です。 SQL ID は、ストリングの library-id として使用されます。 区切られた ID でない場合、ID は大文字に変換されます。 ID がスキーマ名で修飾されている場合、スキーマ名の部分は無視されます。 この形式の NAME は、LANGUAGE C でのみ使用可能です (CREATE TYPE のメソッド指定で定義)。
- string オプションは、最大 254 バイトのストリング定数です。 ストリングに使用される形式は、指定した LANGUAGE によって異なります。 特定の言語規則について詳しくは、
- TRANSFORM GROUP グループ名
- メソッドを呼び出す際のユーザー定義の構造化タイプのトランスフォーメーションに使用する
トランスフォーム・グループを指定します。 メソッド定義には、ユーザー定義の構造化タイプが含まれているため、トランスフォームが必要です。
ここで、トランスフォーム・グループ名を指定することを強くお勧めします。 この節が指定されない場合、使用されるデフォルトのグループ名は DB2_FUNCTION です。 参照された構造化タイプに、指定した (またはデフォルトの) グループ名が定義されていない場合には、 エラーになります (SQLSTATE 42741)。 同様に、指定したグループ名または構造化タイプに、 必須の FROM SQL または TO SQL トランスフォーム関数が定義されていない場合には、エラーになります (SQLSTATE 42744)。
- INHERIT ISOLATION LEVEL WITHOUT LOCK REQUEST または INHERIT ISOLATION LEVEL WITH LOCK REQUEST
- メソッドが呼び出し元のステートメントの分離レベルを継承している場合に、
ロック要求をステートメントの分離レベルに関連付けることができるかどうかを指定します。 デフォルトは INHERIT ISOLATION LEVEL WITHOUT LOCK REQUEST です。
- INHERIT ISOLATION LEVEL WITHOUT LOCK REQUEST
- メソッドが呼び出し元のステートメントの分離レベルを継承している場合に、 指定した isolation-clause (分離節) の一部として lock-request-clause (ロック要求節) が含まれている SQL ステートメントの コンテキストでそのメソッドを呼び出すことができません (SQLSTATE 42601)。
- INHERIT ISOLATION LEVEL WITH LOCK REQUEST
- メソッドが呼び出し元のステートメントの分離レベルを継承している場合に、 指定した lock-request-clause (ロック要求節) をメソッドが継承することを指定します。
- SQL-method-body
- CREATE TYPE のメソッド仕様が LANGUAGE SQL の場合、SQL-method-body は、
どのようにメソッドがインプリメントされるかを定義します。SQL-method-body は、以下のメソッド仕様のパーツに従っていなければなりません。
- DETERMINISTIC または NOT DETERMINISTIC (SQLSTATE 428C2)
- EXTERNAL ACTION または NO EXTERNAL ACTION (SQLSTATE 428C2)
- CONTAINS SQL または READS SQL DATA (SQLSTATE 42985)
パラメーター名を SQL-method-body で参照することができます。 メソッドのサブジェクトは、暗黙的な最初のパラメーター SELF としてメソッド・インプリメンテーションに 渡されます。
詳しくは、
「コンパウンド SQL (インライン化) ステートメント」
および「RETURN ステートメント」
を参照してください。
ルール
- CREATE TYPE または ALTER TYPE ステートメントを使用して、 前もってメソッド指定を定義していなければ、CREATE METHOD は使用できません (SQLSTATE 42723)。
- 作成されるメソッドがオーバーライド・メソッドの場合には、
以下のメソッドに従属するパッケージは無効になります。
- オリジナル・メソッド
- 作成されるスーパータイプのメソッドをサブジェクトとして持つ、他のオーバーライド・メソッド
- XML データ・タイプは、メソッド内で使用できません。
注
- メソッドが SQL を許可する場合、外部プログラムは、 フェデレーテッド・オブジェクトへのアクセスを試行してはなりません (SQLSTATE 55047)。
- 特権: メソッドの定義者は、メソッドに対する EXECUTE 特権と、メソッドをドロップする権利を常に与えられます。
EXTERNAL メソッドが作成されると、 メソッドの定義者は WITH GRANT OPTION 付きの EXECUTE 特権を常に受け取ります。
SQL メソッドが作成されると、 メソッドの定義者がメソッドを定義するために必要なすべての特権に対して WITH GRANT OPTION を持っている場合、 または定義者が SYSADM や DBADM 権限を持っている場合には、 メソッドに対する WITH GRANT OPTION 付きの EXECUTE 特権のみが定義者に与えられます。 SQL メソッドの定義者にそれらの特権が与えられるのは、 それらの特権の派生元の特権がメソッドの作成時に存在している場合に限ります。 定義者は、これらの特権を直接持っているか、または PUBLIC の特権として持っていることが必要です。 メソッドの定義者がメンバーであるグループを持つ特権は考慮されません。 メソッドを使用する場合、接続済みのユーザーの許可 ID には、 そのデータ・ソースでニックネームが参照する表またはビューに対する適切な特権がなければなりません。
- 表アクセスの制限: メソッドが READS SQL DATA として定義されている場合には、メソッドのいかなるステートメントも、メソッドを呼び出したステートメントによって変更されている表にはアクセスできません (SQLSTATE 57053)。
例
- 例 1:
CREATE METHOD BONUS (RATE DOUBLE) FOR EMP RETURN SELF..SALARY * RATE
- 例 2:
CREATE METHOD SAMEZIP (addr address_t) RETURNS INTEGER FOR address_t RETURN (CASE WHEN (self..zip = addr..zip) THEN 1 ELSE 0 END)
- 例 3:
CREATE METHOD DISTANCE (address_t) FOR address_t EXTERNAL NAME 'addresslib!distance' TRANSFORM GROUP func_group