CREATE METHOD ステートメント

CREATE METHOD ステートメントは、既にユーザー定義の構造化タイプの定義の一部となっているメソッド指定に、メソッド本体を関連付けるために使用されます。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。

許可

ステートメントの許可 ID によって保持されている特権には、少なくとも以下のいずれかの権限が含まれていなければなりません。
  • CREATE METHOD ステートメントで参照される構造化タイプのスキーマに対する CREATEIN 特権
  • CREATE METHOD ステートメントで参照される構造化タイプの所有者
  • CREATE METHOD ステートメントで参照される構造化タイプのスキーマに対する SCHEMAADM 権限
  • DBADM 権限
外部メソッド本体をそのメソッド指定に関連付けるためには、 ステートメントの許可 ID の特権に、以下の権限の少なくとも 1 つが含まれている必要もあります。
  • データベースに対する CREATE_EXTERNAL_ROUTINE 権限
  • DBADM 権限
SQL メソッドを作成する場合、全選択で識別される表、ビュー、またはニックネームのそれぞれに対して、 ステートメントの許可 ID に以下の権限が少なくとも 1 つ含まれている必要もあります。
  • その表、ビュー、またはニックネームに対する CONTROL 特権
  • その表、ビュー、またはニックネームに対する SELECT 特権
  • 表、ビュー、またはニックネームが含まれるスキーマに対する SELECTIN 特権
  • 表、ビュー、またはニックネームが含まれるスキーマに対する DATAACCESS 権限
  • データベースに対する DATAACCESS 権限

PUBLIC 以外のグループ特権は、 CREATE METHOD ステートメントで指定された表やビューに対しては考慮されません。

このニックネームで示されている表またはビューのデータ・ソースの許可要件は、 メソッドが呼び出される時に適用されます。 接続の許可 ID は、別のリモート許可 ID へマップできます。

構文

構文図を読む構文図をスキップするCREATE METHODmethod-namemethod-signatureFORtype-nameSPECIFIC METHODspecific-nameEXTERNALNAME'string'identifierTRANSFORM GROUPgroup-nameINHERIT ISOLATION LEVEL WITHOUT LOCK REQUESTINHERIT ISOLATION LEVEL WITH LOCK REQUESTSQL-method-body
method-signature
構文図を読む構文図をスキップするmethod-name (,parameter-namedata-type1AS LOCATOR) RETURNSdata-type2AS LOCATORdata-type3CAST FROMdata-type4AS LOCATOR
SQL-method-body
構文図を読む構文図をスキップするRETURNCompound SQL (inlined)1
注:
  • 1 コンパウンド SQL (インライン化) ステートメントがサポートされているのは、非パーティション・データベース内の SQL メソッド定義の SQL-method-body だけです。

説明

METHOD
ユーザー定義の構造化タイプに関連付けられる既存のメソッド指定を識別します。 メソッド指定は、以下のいずれかの方法で識別できます。
method-name
メソッド本体に対して定義するメソッド指定の名前を指定します。 暗黙的スキーマは、サブジェクト・タイプ (type-name) のスキーマです。 この method-name のある type-name には、 1 つしかメソッドを指定できません (SQLSTATE 42725)。
method-signature
定義するメソッドを一意的に識別できるメソッド・シグニチャーを指定します。 このメソッド・シグニチャーは、 CREATE TYPE または ALTER TYPE ステートメントで提供されたメソッド指定と一致しなければなりません (SQLSTATE 42883)。
method-name
メソッド本体に対して定義するメソッド指定の名前を指定します。 暗黙的スキーマは、サブジェクト・タイプ (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 ロケーターが実際の値の代わりにメソッドから戻されるように指定できます。
FOR type-name
指定されたメソッドを関連付けるタイプを指定します。 ここで指定される名前は、 カタログに既に記述されているタイプを示すものでなければなりません (SQLSTATE 42704)。 動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターが、 修飾子のないオブジェクト名の修飾子として使用されます。 静的 SQL ステートメントでは、QUALIFIER プリコンパイル/BIND オプションにより、 修飾子のないオブジェクト名の修飾子が暗黙指定されます。
SPECIFIC METHOD specific-name
CREATE TYPE 時に指定されたか、デフォルト値として与えられた値を使用して、 特定のメソッドを識別します。 specific-name は、指定したスキーマまたは暗黙のスキーマのメソッド指定を識別しなければなりません。 そうでない場合、エラーになります (SQLSTATE 42704)。
EXTERNAL
この節は、この CREATE METHOD ステートメントを使用して登録するメソッドが、 外部プログラミング言語で作成されたコードに基づいており、 文書化されたリンケージの規則とインターフェースに従っていることを示します。 CREATE TYPE で適合するメソッド指定は、SQL 以外の LANGUAGE を指定しなければなりません。 このメソッドが呼び出されると、メソッドのサブジェクトが、 暗黙の最初のパラメーターとしてインプリメンテーションに渡されます。

NAME 節の指定がない場合、"NAME method-name" が想定されます。

NAME
この節は、定義するメソッドをインプリメントするユーザー作成コードの名前を指定します。
'string'
string オプションは、最大 254 バイトのストリング定数です。ストリングに使用される形式は、指定した LANGUAGE によって異なります。 特定の言語規則に関する詳細は、『CREATE FUNCTION (外部スカラー) ステートメント』を参照してください。
identifier
指定する identifier は SQL ID です。 SQL ID は、ストリングの library-id として使用されます。 区切られた ID でない場合、ID は大文字に変換されます。 ID がスキーマ名で修飾されている場合、スキーマ名の部分は無視されます。 この形式の NAME は、LANGUAGE C でのみ使用可能です (CREATE TYPE のメソッド指定で定義)。
TRANSFORM GROUP group-name
メソッドを呼び出す際のユーザー定義の構造化タイプのトランスフォーメーションに使用する トランスフォーム・グループを指定します。 メソッド定義には、ユーザー定義の構造化タイプが含まれているため、トランスフォームが必要です。

ここで、トランスフォーム・グループ名を指定することを強くお勧めします。 この節が指定されない場合、使用されるデフォルトのグループ名は 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