2

別のストアド プロシージャをコーディングするときに、完全なスキーマ名を指定せずに同じスキーマ内のストアド プロシージャを呼び出すにはどうすればよいですか。これらは、DB2 内の SQL PL プロシージャーです。

最初の SP:

CREATE PROCEDURE MYSCHEMA.SP_TEST
  LANGUAGE SQL
  BEGIN
  END

スキーマ名なしでこの SP を直接呼び出す SP を作成すると、コンパイル エラーが発生します。

CREATE PROCEDURE MYSCHEMA.SP_TEST2
  LANGUAGE SQL
  BEGIN
    CALL SP_TEST();
  END

それはスローします:

互換性のある引数を持つタイプ "PROCEDURE" の "SP_TEST" という名前の許可されたルーチンが見つかりませんでした.. SQLCODE=-440、SQLSTATE=42884、DRIVER=3.53.71

完全なスキーマ名を直接指定すると、次のように機能します。

CREATE PROCEDURE MYSCHEMA.SP_TEST2
  LANGUAGE SQL
  BEGIN
    CALL MYSCHEMA.SP_TEST();
  END

ただし、別のスキーマに移動した場合は、その参照をあちこちで置き換える必要があります。問題に対する適切な回避策またはより良い解決策はありますか?

4

3 に答える 3

2

特殊レジスターは、CURRENT PATH修飾されていないストアード・プロシージャーおよび関数への呼び出しを解決するために使用されます。 CURRENT SCHEMA修飾されていないオブジェクト名を解決するために使用されます。

デフォルトでCURRENT PATHは、IBM 関数とユーザーの AUTHID があります。

$ db2 "values substr(current path,1,60)"

1
------------------------------------------------------------
"SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","IBJORHOV"

  1 record(s) selected.

SET CURRENT PATHこれはステートメントで変更できます。

ストアード・プロシージャーを作成すると、DB2 はCURRENT PATHコンパイル時に の値を記録し、それらを使用してストアード・プロシージャー内の非修飾ストアード・プロシージャーおよび関数呼び出しを解決します。CURRENT SCHEMA修飾されていないテーブル名にも同じロジックが適用されます。

したがって、ストアド プロシージャ内で非修飾のプロシージャと関数の呼び出しを許可する適切な方法は、CURRENT PATHレジスタを設定してからプロシージャを作成することです。

于 2012-09-28T16:29:34.267 に答える
1

このSET SCHEMAコマンドを使用すると、現在のスキーマを変更できます。

SET CURRENT SCHEMA FOO;
CALL MY_PROC_THAT_RESIDES_IN_FOO();

ただし、スキーマを動的な値に設定するのは簡単ではありません。次のいずれかを行う必要があります。

  1. ホスト変数を使用して何かを行う (呼び出し元のアプリケーション内にいる場合) または
  2. 動的 SQL ステートメント文字列を作成して実行します。

その時点で、それはおそらく価値があるよりも多くの問題になりつつあります.

詳細については、コマンドのドキュメントをSET SCHEMA参照してください。

于 2012-09-27T11:24:27.263 に答える
1

SCHEMA 名の省略は推奨されません。呼び出しでスキーマ名を保持します。別のスキーマに移動する場合は、とにかく SQL スクリプトを抽出/変更してこれを行う必要があります。

于 2012-09-27T09:08:24.730 に答える