プロシージャー解決

プロシージャー呼び出しがあると、Db2® は同じ名前を 持つプロシージャーのうちのどれを実行するのかを決定する必要があります。

  • プロシージャー呼び出しの引数の数を A とします。
  • プロシージャー・シグニチャー中のパラメーターの数を P とします。
  • デフォルトを持たないパラメーターの数を N とします。
プロシージャー呼び出しの解決に対する候補プロシージャーは、以下の基準で選択されます。
  • 各候補プロシージャーは、一致する名前と適用可能なパラメーター数を持つ。 適用可能なパラメーター数とは、NAP という条件を満たすパラメーター数のことです。
  • 各候補プロシージャーには、CALL ステートメントに含まれる名前付き引数ごとに、名前が一致して定位置 (つまり名前なし) 引数にまだ合致していないパラメーターが存在する。
  • 候補プロシージャーのパラメーターのうち、対応引数が CALL ステートメントで位置でも名前でも指定されていない各パラメーターは、デフォルトを使用して定義される。
  • 1 つ以上のスキーマからなる集合からの各候補プロシージャーは、 CALL ステートメントの権限 ID と関連付けられた EXECUTE 特権を 持つ。デフォルト式の中で参照されるオブジェクトの 権限は考慮されません。
さらに、候補プロシージャーのセットは、 プロシージャー名がどのように修飾されているのかに基づきます。
  • プロシージャー名が修飾されていない場合、プロシージャー解決は次のように行われます。

    SQL パス内のスキーマを持つすべてのプロシージャーから候補プロシージャーを検索します。 SQL パスのスキーマで 1 つ以上の候補プロシージャーが見つかると、 それらの候補プロシージャーが候補リストに入れられます。リスト中の候補プロシージャーが 1 つの 場合、解決は完了します。複数の候補プロシージャーがある場合、 SQL パス内で最も早く出現するスキーマを持つプロシージャーを 選択します。まだ複数の候補プロシージャーがある場合、 パラメーター数が最も少ない候補プロシージャーを選択します。

    候補プロシージャーが ない場合は、エラーが戻されます。

  • プロシージャー名が修飾されている場合、プロシージャー解決は次のように 行われます。

    修飾子によって指定されているスキーマ内で 候補プロシージャーを検索します。単一の候補プロシージャーが存在すれば、解決が完了します。複数の候補プロシージャー がある場合、パラメーター数が最も少ない候補プロシージャーを選択し、 解決は完了します。スキーマが存在しないか、 権限がある候補プロシージャーがない場合、エラーが戻されます。

例 1: 4 つの異なるスキーマに 6 個の FOO プロシージャーがあり、以下のように登録されているとします (必須キーワードの一部は省略されています)。
  CREATE PROCEDURE AUGUSTUS.FOO (INT) SPECIFIC FOO_1 ...
  CREATE PROCEDURE AUGUSTUS.FOO (DOUBLE, DECIMAL(15, 3)) SPECIFIC FOO_2 ...
  CREATE PROCEDURE JULIUS.FOO (INT) SPECIFIC FOO_3 ...
  CREATE PROCEDURE JULIUS.FOO (INT, INT, INT) SPECIFIC FOO_4 ...
  CREATE PROCEDURE CAESAR.FOO (INT, INT) SPECIFIC FOO_5 ...
  CREATE PROCEDURE NERO.FOO (INT,INT) SPECIFIC FOO_6 ...
以下のようにプロシージャーが参照されるとします (I1 および I2 は INTEGER 値です)。
  CALL FOO(I1, I2)
この参照を行うアプリケーションの SQL パスが次のようになっているとします。
 "JULIUS", "AUGUSTUS", "CAESAR"
スキーマ「NERO」は SQL パスに含まれていないため、 アルゴリズムに従って、特定名 FOO_6 のプロシージャーは候補から除かれます。 パラメーターの数が違うため、FOO_1、FOO_3、および FOO_4 は候補から除かれます。 残った候補は順番に考慮され、SQL パスにより判別します。 引数およびパラメーターのタイプは無視されることに注意してください。 FOO_5 のパラメーターは CALL の引数と正確に一致しますが、 SQL パスで "CAESAR" の前に "AUGUSTUS" が現れるため FOO_2 が選ばれます。
例 2: 次の例は、 CALL ステートメントで名前付きパラメーターを使用するプロシージャー解決を 示します。
 CREATE PROCEDURE p1(i1 INT)...
 CREATE PROCEDURE p1(i1 INT DEFAULT 0, i2 INT DEFAULT 0)...
 
CALL p1(i2=>1)
候補選択プロセスでは引数の名前が考慮に 入れられるため、2 番目のバージョンの p1 のみが候補であると 見なされます。さらに、これは正常に呼び出されます。このバージョンの p1 の i1 はデフォルトを指定して定義されているので、p1 の呼び出しで i2 のみを指定しても有効だからです。 このプロシージャーのパラメーター i1 には値 0 が渡されます。
  CREATE PROCEDURE p2(i1 INT, i2 INT DEFAULT 0)...
  CREATE PROCEDURE p2(i1 INT DEFAULT 0, i2 INT DEFAULT 0, i3 INT DEFAULT 0)...
  
  CALL p2(i2=>1)
CALL ステートメント に (位置または名前で指定された) 対応する引数がないプロシージャー・パラメーターに関する基準の 1 つは、 そのパラメーターがデフォルト値を指定して定義されることです。したがって、最初のバージョンの p2 は、 パラメーター i1 にデフォルト値が定義されていないため、候補と 見なされません。2 番目のバージョンの p2 が選択され、第 1 パラメーターおよび第 3 パラメーターのデフォルト値 が渡されます。