DEFER および NODEFER バインド・オプション

DEFER および NODEFER オプションは、リモート・オブジェクトを参照する動的 SQL ステートメントの準備を据え置きにするか、それともすぐに準備を実行するかを判別します。

コマンド・オプション オプションの値 と併用
  • NODEFER
  • DEFER
  • NODEFER(PREPARE)
  • DEFER(PREPARE)
  • defer(inheritfromplan) 1
注:
  1. DEFER(INHERITFROMPLAN) オプションは、ネイティブRESTサービスのパッケージのリバインドには有効ではありません。
  2. DEFERおよびNODEFERのバインドオプションは、 ネイティブSQLプロシージャまたはアドバンスト・トリガのパッケージのREBINDには有効ではありません。

準備を先延ばしにすると、 Db2 が動的ステートメントを参照するEXECUTE、OPEN、またはDESCRIBEのタイプのステートメントを最初に検出したときに、動的ステートメントが準備されます。

BIND と REBIND PACKAGE の場合、どちらのオプションも指定されておらず、 しかも REOPT(NONE) が適用される場合、次のようになります。
  • ローカル・バインドの場合は、パッケージは実行時にプランのオプションを継承します。
  • リモートバインドの場合、デフォルトはリモート Db2 サーバーでのNODEFER(PREPARE)です。

REOPT(ALWAYS)、REOPT(AUTO)、またはREOPT(ONCE)のバインドオプションを指定した場合、 Db2 は自動的にDEFER(PREPARE)のバインドオプションを設定します。

DEFER と NODEFER の両方を使用することは できません。

DEFERとNODEFERのオプションの説明

NODEEFER 準備する
準備の据え置きを行いません。
DEFER(PREPARE)
準備を据え置きにします。
DEFER(INHERITFROMPLAN)
パッケージがリモートでバインドされたか、ローカルでバインドされたかに関係なく、ローカル・パッケージは、プランの DEFER オプションの値を継承します。

DEFER(INHERITFROMPLAN) オプションを使用してパッケージをリモートにバインドし、リモート・サーバーが INHERITFROMPLAN 値を認識しない場合には、サーバーがエラーを戻す場合があります。

以下の状態では、関連するプランが存在しないため、DEFER(INHERITFROMPLAN) 値は適用されません。

  • アプリケーションをローカルにバインドし、パッケージをリモート・サーバーにコピーする場合。
  • RRSAF を使用するアプリケーションをバインドする場合。
  • ユーティリティー用に作成したパッケージの場合

こうした場合、NODEFER(PREPARE) がパッケージに対して有効になります。

DEFER(PREPARE)と分散処理

DRDAアクセス用の動的SQLをバインドする際は、NODEFER(PREPARE)ではなく、パフォーマンスを向上させるためにBINDオプションDEFER(PREPARE)を指定してください。 Db2 そのステートメントが実行されるまで、動的SQLステートメントを準備しません。 (この条件の例外は、動的 SELECT で、DEFER(PREPARE) オプションが有効であるかどうかに関係なく、PREPARE と DESCRIBE を組み合わせます。) 動的 SQL ステートメントがリモート・データにアクセスする場合、PREPARE と EXECUTE ステートメントは、ネットワーク上を一緒に伝送されて、リモート・ロケーションで処理されます。 両方のステートメントに対する応答が、一緒にローカル・サブシステムに戻されます。 これによってネットワーク・トラフィックが減少するため、 動的 SQL ステートメントのパフォーマンスが向上することになります。

INTO 文節を含む PREPARE ステートメントは据え置かれません。

アプリケーション内で SQL ステートメントの準備を据え置きにするには、 そのアプリケーションをバインドまたは再バインドする際に オプション DEFER(PREPARE) を指定します。 これにより、リモート・オブジェクトを参照する SQL ステートメント の PREPARE メッセージが以下のいずれかが生じるまで据え置きにされます。
  • ステートメントが実行される
  • アプリケーションが、ステートメントの結果の記述を要求する

PREPARE ステートメントを据え置きすることにした場合、EXECUTE または DESCRIBE ステートメント の後でその PREPARE ステートメントが戻す可能性のある SQL エラー・コードや SQLSTATE を 処理するようアプリケーションをコーディングしなければなりません。 PREPARE ステートメントを据え置きにできるのは、 バインド・オプション DEFER(PREPARE) を指定した場合に限られます。

DEFERとNODEFERのデフォルト値

処理 デフォルトの 値
BIND PLAN NODEFER
BIND PACKAGE プラン値
REBIND PLAN 既存の値
REBIND PACKAGE 既存の値

DEFERおよびNODEFERのカタログレコード

SYSPLAN カタログ・テーブルの DEFERPREP 列、または SYSPACKAGE カタログ・テーブルの DEFERPREPARE 列を参照してください。