CREATE PROCEDURE (ソース派生) ステートメント
CREATE PROCEDURE (ソース派生) ステートメントは、 別のプロシージャー (ソース・プロシージャー) に基づくプロシージャー (ソース派生プロシージャー) を定義します。 フェデレーテッド・システムにおいて、フェデレーテッド・プロシージャー とは、 サポートされているデータ・ソースにソース・プロシージャーを持つソース派生プロシージャーのことです。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。
許可
- データベースに対する IMPLICIT_SCHEMA 権限 (プロシージャーのスキーマ名が 既存のスキーマを指していない場合)
- スキーマに対する CREATEIN 特権 (プロシージャーのスキーマ名が既存のスキーマを指している場合)
- スキーマに対する SCHEMAADM 権限 (プロシージャーのスキーマ名が既存のスキーマを指している場合)
- DBADM 権限
ユーザー・マッピングが必要なデータ・ソースの場合、ステートメントの許可 ID がデータ・ソースで保持する特権に、リモート・カタログ表からプロシージャーの記述を選択できる特権が含まれていなければなりません。
既存のプロシージャーを置換するには、ステートメントの許可 ID が既存のプロシージャーの所有者でなければなりません (SQLSTATE 42501)。
構文
説明
- OR REPLACE
- プロシージャーの定義が現行のサーバー上に存在している場合に、そのプロシージャーの定義を置換するために指定します。 既存の定義は、新しい定義がカタログ内で置換される前に効率的にドロップされます。ただし、プロシージャーに対して付与された特権は影響を受けないという例外があります。 このオプションは、オブジェクトの所有者しか指定できません。このオプションは、プロシージャーの定義が現行のサーバー上に存在しない場合は無視されます。 既存のプロシージャーを置換するには、新規定義の特定名およびプロシージャー名が旧定義の特定名とプロシージャー名と同じであるか、または新規定義のシグニチャーが旧定義のシグニチャーと一致していなければなりません。 それ以外の場合は、新規プロシージャーが作成されます。
- procedure-name
- 定義するソース派生プロシージャーの名前を指定します。この名前は、プロシージャーを指定する修飾または非修飾の名前です。
procedure-name の非修飾形式は SQL ID です。動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターが、
修飾子のないオブジェクト名の修飾子として使用されます。
静的 SQL ステートメントでは、QUALIFIER のプリコンパイルまたはバインド・オプションによって、修飾子のないオブジェクト名の修飾子が暗黙指定されます。
修飾形式は、schema-name の後にピリオドと SQL ID が続きます。
暗黙または明示の修飾子を含む名前と、パラメーターの数との組み合わせは、 カタログに既に記述されているプロシージャーを指定するものであってはなりません (SQLSTATE 42723)。 非修飾名とパラメーターの数との組み合わせは、複数のスキーマ間で固有である必要はありません。
2 つの部分からなる名前を指定する場合、 SYS で始まる schema-name (スキーマ名) は使用できません (SQLSTATE 42939)。
フェデレーテッド・システムでは、procedure-name はフェデレーテッド・サーバー上のプロシージャーの名前です。
- SOURCE source-object-name
- 定義するプロシージャーで使用されるソース・プロシージャーを指定します。
フェデレーテッド・システムでは、ソース・プロシージャーは、サポートされるデータ・ソースにあるプロシージャーです。
- source-schema-name
- ソース・プロシージャーのスキーマ名を示します。 スキーマ名を使用してソース・プロシージャーを識別する場合は、CREATE PROCEDURE (ソース派生) ステートメントで source-schema-name を指定する必要があります。 source-schema-name に特殊文字や小文字が含まれる場合には、二重引用符で囲まなければなりません。
- source-package-name
- ソース・プロシージャーのパッケージ名を示します。 source-package-name は、Oracle データ・ソースにのみ適用されます。 パッケージ名を使用してソース・プロシージャーを識別する場合は、CREATE PROCEDURE (ソース派生) ステートメントで source-package-name を指定する必要があります。 source-package-name に特殊文字や小文字が含まれる場合には、二重引用符で囲まなければなりません。
- source-procedure-name
- ソース・プロシージャーのプロシージャー名を示します。 source-procedure-name に特殊文字や小文字が含まれる場合には、二重引用符で囲まなければなりません。
- ( )
- パラメーターの数がゼロであることを指定します。
- NUMBER OF PARAMETERS integer
- ソース・プロシージャーのパラメーターの数を指定します。 integer の最小値は 0、最大値は 32 767 です。
- UNIQUE ID string-constant
- データ・ソースに名前、スキーマ、パラメーター数が同じプロシージャーが複数ある場合にソース・プロシージャーを一意的に識別するためのものを指定します。 string-constant 値 (最大長 128) は、データ・ソースごとに一意的に解釈されます。
- FOR SERVER server-name
- CREATE SERVER ステートメントを使用して登録されたサーバー定義を指定します。
- SPECIFIC specific-name
- 定義するソース派生プロシージャーのインスタンスに固有の名前を指定します。
この特定名は、このソース派生プロシージャーを変更する場合、ドロップする場合、
またはこのソース派生プロシージャーにコメントを付ける場合に使用することができます。 この名前を使用してソース派生プロシージャーを呼び出すことはできません。非修飾形式の specific-name は SQL ID です。
specific-name の修飾形式は、schema-name の後にピリオドと SQL ID が続きます。
暗黙または明示の修飾子も含め、specific-name 値が、アプリケーション・サーバーに存在する別のプロシージャー・インスタンスを示すものであってはなりません。さもないと、エラーが戻されます (SQLSTATE 42710)。
specific-name は、既存の procedure-name と同じにすることができます。
修飾子を指定しない場合、procedure-name に使用された修飾子が使用されます。 修飾子を指定する場合は、procedure-name の明示修飾子または暗黙修飾子と同じでなければなりません。そうでない場合、エラーが戻されます (SQLSTATE 42882)。
specific-name の指定がない場合、固有名がデータベース・マネージャーによって生成されます。 生成される固有名は、'SQL' の後に文字タイム・スタンプが続く名前です ('SQLyymmddhhmmssxxx')。
- WITH RETURN TO CALLER または WITH RETURN TO CLIENT
- ソース・プロシージャーからの結果セットをどこで扱うかを指示します。Oracle データ・ソースからのソース・プロシージャーでない場合は、1 つの結果セットのみが呼び出し側またはクライアントに戻されます。ソース・プロシージャーのコーディングが複数の結果セットを戻すようになっている場合は、最初の結果セットのみが呼び出し側またはクライアントに戻されます。デフォルトは WITH RETURN TO CALLER です。
- WITH RETURN TO CALLER ALL
- ソース・プロシージャーからのすべての結果セットを呼び出し側に戻すことを指定します。
- WITH RETURN TO CLIENT
- ソース・プロシージャーからのどの結果セットをクライアント・アプリケーションに直接戻すかを指示します。戻される結果セットに関して、データ・ソースにある動的結果セット値は 0 より大きくなければなりません。
- (result-set-element-number, ...)
- 結果セットの空でないリストがクライアント・アプリケーションに戻されることを指定します (SQLSTATE 42601)。result-set-element-number は、結果セットが戻される順序に基づいて結果セットを識別します。1 は最初の結果セットを示し、2 は 2 番目の結果セットを示し、以後も同様です。result-set-element-number が戻される結果セットの総数より大きい場合は、無視されます。各 result-set-element-number はゼロより大きい整数値でなければならず (SQLSTATE 42815)、短精度整数定数の値を超えてはなりません (SQLSTATE 42820)。クライアント・アプリケーションに戻される結果セットのリストは、重複値が含まれていてはならず、昇順で指定しなければなりません (SQLSTATE 42815)。結果セットは常に、ソース・プロシージャーから戻される順序で処理されます。
クライアント・アプリケーションに戻されるリスト内で識別されない結果セットは、呼び出し側に戻されます。
注: クライアント・アプリケーションに戻されるこの結果セットのリストと併用するソース・プロシージャーは、実行されるたびに、結果セットのリスト内の同じ位置にクライアント用の結果セットを一貫して戻すことが分かっていなければなりません。ソース・プロシージャーの内部論理によっては、そのプロシージャーが、実行されるたびに別の結果セットの集合を戻すことがあります。この場合、代わりに WITH RETURN TO CALLER ALL または WITH RETURN TO CLIENT ALL を指定し、アプリケーションがこのケースを処理するようにコーディングしてください。 - ALL
- ソース・プロシージャーからのすべての結果セットをクライアントに戻すことを指定します。
- NO SQL, CONTAINS SQL, MODIFIES SQL DATA, READS SQL DATA
- このプロシージャーで実行できる SQL ステートメント、またはこのプロシージャーから呼び出されるすべてのルーチンで実行できる SQL ステートメントの種別を指定します。
データベース・マネージャーによって、プロシージャーで実行される SQL ステートメント、およびプロシージャーから呼び出されるすべてのルーチンで実行される SQL ステートメントが、この指定と整合しているかどうかが検査されます。
各ステートメントの種別については、ルーチンおよびトリガー内で実行できる SQL ステートメントを参照してください。
フェデレーテッド・サーバーにはソース派生プロシージャーのソース・プロシージャーがないため、データ・ソースでのソース・プロシージャーの実行時には、指定したレベルの制約は受けません。 ソース派生プロシージャーに指定されていることとソース・プロシージャーがデータ・ソースで実際に行っていることに矛盾がある場合は、データ不整合が起こる可能性があります。
このオプションを明示的に指定しない場合は、ソース・プロシージャーの値が使用されます。
このオプションを明示的に指定した場合でも、ソース・プロシージャーの値と一致していなければ、エラーが戻されます (SQLSTATE 428GS)。
このオプションがデータ・ソースで使用できない場合、デフォルトは MODIFIES SQL DATA です。
- NO SQL
- データ・アクセス種別が NO SQL である SQL ステートメントのみをプロシージャーで実行できるように指定します。(SQLSTATE 38001)。
- CONTAINS SQL
- データ・アクセス種別が CONTAINS SQL または NO SQL であるステートメントのみをプロシージャーで実行できるように指定します (SQLSTATE 38003 または 38004)。
- MODIFIES SQL DATA
- このプロシージャーは、プロシージャーでサポートされていないステートメント以外の すべての SQL ステートメントを実行できることを指定します (SQLSTATE 38003)。
- READS SQL DATA
- データ・アクセス種別が READS SQL DATA、CONTAINS SQL、または NO SQL であるステートメントをプロシージャーで実行できるように指定します (SQLSTATE 38002、38003、または 42985)。
- DETERMINISTIC または NOT DETERMINISTIC
- 与えられた引数値に対してソース派生プロシージャーが常に同じ結果を戻すか (DETERMINISTIC)、 それとも示された値に依存してソース派生プロシージャーの結果が影響を受けるか (NOT DETERMINISTIC) を指定します。 DETERMINISTIC が指定されたソース派生プロシージャーは、同じ入力を指定した連続呼び出しで常に同じ結果を戻します。 現在、この節はプロシージャーの処理に影響を与えません。 このオプションを明示的に指定しない場合は、ソース・プロシージャーの値が使用されます。 このオプションがデータ・ソースで使用できない場合、デフォルトは NOT DETERMINISTIC です。 このオプションを明示的に指定した場合でも、ソース・プロシージャーの値と一致していなければ、エラーが戻されます (SQLSTATE 428GS)。
- EXTERNAL ACTION または NO EXTERNAL ACTION
- ソース派生プロシージャーが、データベース・マネージャーによって管理されていないオブジェクトの状態を変更するアクションを取るか (EXTERNAL ACTION)、または取らないか (NO EXTERNAL ACTION) を指定します。 NO EXTERNAL ACTION 節が指定されると、フェデレーテッド・データベースは、ソース派生プロシージャーは外部に影響を与えないという前提の最適化を使用します。 このオプションを明示的に指定しない場合は、ソース・プロシージャーの値が使用されます。 このオプションがデータ・ソースで使用できない場合、デフォルトは EXTERNAL ACTION です。 このオプションを明示的に指定した場合でも、ソース・プロシージャーの値と一致していなければ、エラーが戻されます (SQLSTATE 428GS)。
規則
- source-object-name と NUMBER OF PARAMETERS および UNIQUE ID 節でもデータ・ソースにあるプロシージャーを識別できない場合は、エラーが戻されます (SQLSTATE 42883)。複数のプロシージャーを識別できた場合も、エラーが戻されます (SQLSTATE 42725)。
- UNIQUE ID 節を指定しても、データ・ソースがユニーク ID をサポートしていなければ、エラーが戻されます (SQLSTATE 42883)。
注
- データ・ソース用のフェデレーテッド・プロシージャーを登録する前に、フェデレーテッド・サーバーはそのデータ・ソースへアクセスするように構成されなければなりません。 この構成には、データ・ソース用ラッパーの登録、データ・ソースのサーバー定義の作成のほかに、フェデレーテッド・サーバーと、ユーザー・マッピングを必要とするデータ・ソースのデータ・ソース・サーバー間の、ユーザー・マッピングの作成が含まれます。
- 最初は無効になっているプロシージャーの作成: プロシージャー本体で参照されるオブジェクトが存在しないか無効にマークされている場合、あるいは定義者に、そのオブジェクトへのアクセス権が一時的に付与されていない場合でも、データベース構成パラメーター auto_reval が DISABLED に設定されていなければ、プロシージャーは正常に作成されます。このプロシージャーは無効とマークされ、 次回に呼び出されたときに再度有効性が確認されます。
- フェデレーテッド・サーバーで定義される SQL プロシージャーや外部プロシージャーとは異なり、フェデレーテッド・プロシージャーは、呼び出し側の特殊レジスターを継承しません。remote-object-name が IBM® データ・ソース上のプロシージャーを指すものについてもこれが当てはまります。
- ソース・プロシージャーの定義が変更された (例えば、パラメーターのデータ・タイプが変更された) 場合は、フェデレーテッド・プロシージャーをドロップして再作成する必要があります。そうしないと、フェデレーテッド・プロシージャーが呼び出されたときにエラーが発生する可能性があります。
- ソース・プロシージャー・パラメーターの長さが 128 文字より長い場合、フェデレーテッド・プロシージャーのパラメーター名は 128 バイトに切り捨てられます。
- 互換性: ストアード・プロシージャー・ニックネーム作成用の DataJoiner 構文はサポートされていません。 パラメーター・タイプ・マッピングがニックネームと同じように扱われ、カタログ参照でリモート・データ・タイプが判別されます。 ローカル・パラメーター・タイプは、フォワード・タイプ・マッピングで判別されます。
例
- 例 1: EMPLOYEE という名前の Oracle プロシージャー用に FEDEMPLOYEE という名前のフェデレーテッド・プロシージャーを作成します。フェデレーテッド・サーバー S1 でのリモート・スキーマ名として USER1、リモート・パッケージ名として P1 を使用し、結果セットをクライアントに戻します。
CREATE PROCEDURE FEDEMPLOYEE SOURCE USER1.P1.EMPLOYEE FOR SERVER S1 WITH RETURN TO CLIENT ALL - 例 2: SALARYSTAT という名前の Oracle プロシージャー用に FEDSALARYSTAT という名前のフェデレーテッド・プロシージャーを作成します。フェデレーテッド・サーバー S1 でのリモート・スキーマ名として USER1、リモート・パッケージ名として P1 を使用し、最初と 3 番目の結果セットをクライアントに戻し、残りの結果セットを呼び出し側に戻します。
CREATE OR REPLACE PROCEDURE FEDSALARYSTAT SOURCE USER1.P1.SALARYSTAT FOR SERVER S1 WITH RETURN TO CLIENT(1,3)
