コンパイル済み SQL オブジェクトのプリコンパイル・オプションと BIND オプションのカスタマイズ

SQL プロシージャー、コンパイル済み関数、コンパイル済みトリガー、およびコンパウンド SQL (コンパイル済み) ステートメントのプリコンパイルおよびバインド・オプションは、 Db2® レジストリー変数または一部の SQL プロシージャー・ルーチンを使用してカスタマイズできます。

このタスクについて

コンパイル済み SQL オブジェクトのプリコンパイルおよびバインド・オプションをカスタマイズするには、インスタンス全体の Db2 レジストリー変数 DB2_SQLROUTINE_PREPOPTSを設定します。 以下に例を示します。
   db2set DB2_SQLROUTINE_PREPOPTS=options

これらのオプションは、 SET_ROUTINE_OPTS ストアード・プロシージャーを使用して、プロシージャー・レベルで変更できます。 現行セッションで SQL プロシージャーを作成するために設定されているオプションの値は、 GET_ROUTINE_OPTS 関数を使用して取得できます。

特定のルーチンをコンパイルするために使用されるオプションは、ルーチンに対応する行のシステム・カタログ表 ROUTINES.PRECOMPILE_OPTIONS に保管されています。 ルーチンが再検証されると、それらの保管オプションも再検証時に使用されます。

ルーチンを作成した後で、SYSPROC.ALTER_ROUTINE_PACKAGE プロシージャーおよび SYSPROC.REBIND_ROUTINE_PACKAGE プロシージャーを使用してコンパイル・オプションを変更できます。 変更済みオプションは、ROUTINES_PRECOMPILE_OPTIONS システム・カタログ表に反映されます。

注: カーソル・ブロッキングは、FETCH ステートメントで参照されるカーソル、および FOR ステートメントでの暗黙カーソルに対して、SQL プロシージャーでは使用不可になっています。 BLOCKING バインド・オプションに指定される値にかかわりなく、最適化された、非常に効率的な方法で一度に 1 行ずつデータを取得します。

この例に使用されている SQL プロシージャーは、次の CLP スクリプトで定義されます。 これらのスクリプトは sqlpl サンプル・ディレクトリーにはありませんが、 CREATE プロシージャー・ステートメントを独自のファイルにカット・アンド・ペーストすることによって、 これらのファイルを簡単に作成できます。

これらの例では「expenses」という名前の表を使用します。 これは、次のようにしてサンプル・データベース内に作成できます。
   db2 connect to sample
   db2 CREATE TABLE expenses(amount DOUBLE, date DATE)
   db2 connect reset
初めに、日付用の ISO フォーマットの使用をインスタンス全体に適用される設定として指定します。
   db2set DB2_SQLROUTINE_PREPOPTS="DATETIME ISO"
   db2stop
   db2start
変更を有効にするには、Db2 インスタンスをいったん停止してから再始動する必要があります。
次に、データベースに接続します。
   db2 connect to sample
最初のプロシージャーは、CLP スクリプト maxamount.db2 で次のように定義されます。
   CREATE PROCEDURE maxamount(OUT maxamnt DOUBLE)
   BEGIN
     SELECT max(amount) INTO maxamnt FROM expenses;
   END @
これは、オプション DATETIME ISO および ISOLATION URを使用して作成されます。
   db2 "CALL SET_ROUTINE_OPTS(GET_ROUTINE_OPTS() || ' ISOLATION UR')"
   db2 -td@ -vf maxamount.db2
次のプロシージャーは、CLP スクリプト fullamount.db2 で次のように定義されます。
CREATE PROCEDURE fullamount(OUT fullamnt DOUBLE)
BEGIN
  SELECT sum(amount) INTO fullamnt FROM expenses;
END @
これは、オプション ISOLATION CS を使用して作成されます (この場合、インスタンス全体の DATETIME ISO 設定は使用されないことに注意してください)。
   CALL SET_ROUTINE_OPTS('ISOLATION CS')
   db2 -td@ -vf fullamount.db2
例の最後のプロシージャーは、CLP スクリプト perday.db2 で次のように定義されます。
CREATE PROCEDURE perday()
BEGIN
  DECLARE cur1 CURSOR WITH RETURN FOR
    SELECT date, sum(amount)
    FROM expenses
    GROUP BY date;

    OPEN cur1;
END @
最後の SET_ROUTINE_OPTS 呼び出しでは、引数として NULL 値を使用しています。 これにより、 DB2_SQLROUTINE_PREPOPTS レジストリーで指定されたグローバル設定が復元されるため、最後の手順はオプション DATETIME ISOを使用して作成されます。
   CALL SET_ROUTINE_OPTS(NULL)
   db2 -td@ -vf perday.db2