PREPARE

PREPARE ステートメントは、ストリング形式のステートメントから、実行可能な SQL ス テートメントを作成します。文字ストリング形式はステートメント・ストリング と呼ばれ、実行可能形式は準備済みステートメント と呼ばれます。

呼び出し

このステートメントは、アプリケーション・プログラムのみに組み込むことができます。 これは実行可能ステートメントですが、動的に準備することはできません。Java の場合、 このステートメントを指定してはいけません。

許可

許可規則は、PREPARE ステートメントで指定する SQL ステートメントの 動的準備に対して定義されている規則となります。例えば、SELECT ステートメントを準備する際に適用される許可規則については、照会を参照してください。

変更の始まりEXPLAIN 特権のみを使用して準備されたステートメントは実行できず、このステートメントの説明情報のみを取得できます。変更の終わり

構文

構文図を読む
>>-PREPARE--statement-name-------------------------------------->

>--+----------------------------------------------+------------->
   '-INTO -descriptor-name--+-------------------+-'   
                            |        .-NAMES--. |     
                            '-USING--+-LABELS-+-'     
                                     +-ANY----+       
                                     '-BOTH---'       

>--+-+------------------------------------+--FROM--host-variable-+-><
   | |                                (1) |                      |   
   | '-ATTRIBUTES--attr-host-variable-----'                      |   
   |                         (2)                                 |   
   '-FROM--string-expression-------------------------------------'   

注:
  1. attr-host-variable はストリング・ホスト変数でなけれ ばならず、その内容は attribute-string の規則に準拠している必要があります。ATTRIBUTES 文節は 、host-variable の前にのみ指定することができます。
  2. string-expression は PLI で唯一サポー トされています。

attribute-string

構文図を読む
   .-----------------------------------------------------.   
   V  (1)                                                |   
>>-------+-+-ASENSITIVE-------------+------------------+-+-----><
         | +-INSENSITIVE------------+                  |     
         | |            .-DYNAMIC-. |                  |     
         | '-SENSITIVE--+---------+-'                  |     
         |              '-STATIC--'                    |     
         +-+-NO SCROLL-+-------------------------------+     
         | '-SCROLL----'                               |     
         +-| holdability |-----------------------------+     
         +-| returnability |---------------------------+     
         +-| rowset-positioning |----------------------+     
         +-fetch-first-clause--------------------------+     
         +-+-read-only-clause-+------------------------+     
         | '-update-clause----'                        |     
         +-optimize-clause-----------------------------+     
         +-isolation-clause----------------------------+     
         |                       (2)                   |     
         +-+-FOR MULTIPLE ROWS-+-----------------------+     
         | '-FOR SINGLE ROW----'                       |     
         |                                         (3) |     
         +-+-ATOMIC------------------------------+-----+     
         | '-NOT ATOMIC CONTINUE ON SQLEXCEPTION-'     |     
         +-| concurrent-access-resolution |------------+     
         +-+-WITHOUT EXTENDED INDICATORS-+-------------+     
         | '-WITH EXTENDED INDICATORS----'             |     
         | .-CONCENTRATE STATEMENTS OFF-----------.    |     
         '-+--------------------------------------+----'     
           '-CONCENTRATE STATEMENTS WITH LITERALS-'          

注:
  1. 同じ文節を複数回指定しないでください。オプションが指定されていない場合、関連付けられたステートメントの対応するオプションに指定されているものが、そのデフォルトとなります。
  2. FOR SINGLE ROW 文節または FOR MULTIPLE ROWS 文節は、INSERT ステートメントあるいは MERGE ステートメントの場合のみ指定できます。
  3. ATOMIC 文節または NOT ATOMIC CONTINUE ON SQLEXCEPTION 文節は、INSERT ステートメントの場合のみ指定できます。

holdability:

構文図を読む
>>-+-WITHOUT HOLD-+--------------------------------------------><
   '-WITH HOLD----'   

returnability:

構文図を読む
>>-+-WITHOUT RETURN-------------+------------------------------><
   |              .-TO CALLER-. |   
   '-WITH RETURN--+-----------+-'   
                  '-TO CLIENT-'     

rowset-positioning:

構文図を読む
>>-+-WITHOUT ROWSET POSITIONING-+------------------------------><
   '-WITH ROWSET POSITIONING----'   

変更の始まり

concurrent-access-resolution

変更の終わり
構文図を読む
>>-+-SKIP LOCKED DATA--------+---------------------------------><
   +-USE CURRENTLY COMMITTED-+   
   '-WAIT FOR OUTCOME--------'   

説明

statement-name
準備済みステートメントを指定します。この名前が既存の準備済みステートメントを示す場合、その 準備済みステートメントは破棄されます。この名前は、オープン・カーソルの SELECT ステートメントである 準備済みステートメントを示すものであってはなりません。
INTO
INTO を使用した場合は、PREPARE ステートメントが正しく 実行されると、準備済みステートメントに関する情報が、記述子名 によって指定した SQLDA に入ります。したがって、次の PREPARE ステートメントは、
   EXEC SQL PREPARE S1 INTO :SQLDA FROM :V1;
以下のステートメントと同じです。
   EXEC SQL PREPARE S1 FROM :V1;
   EXEC SQL DESCRIBE S1 INTO :SQLDA;
descriptor-name
SQLDA を指定します。 REXX 以外の言語では、SQLVAR オカレンスの数 を示すように SQLN を設定する必要があります。使用する SQLVAR オカレンス数の判別方法、および SQLDA に入る情報の説明については、DESCRIBEを参照してください。

C の場合に descriptor-name を記述する方法については、C または C++ における SQLDA の指定を参照してください。

USING
INTO を使用する場合、SQLDA 内の SQLNAME 変数のそれぞれに 割り当てる値を示します。要求した値が存在しない場合、SQLNAME は長さ 0 に設定されます。
NAMES
列の名前を割り当てます。これはデフォルトです。
LABELS
列のラベルを割り当てます。(列ラベルは、LABEL ステートメントを使って定義します。)
ANY
列ラベルを割り当てます。 列にラベルがない場合は、列名を割り当てます。
BOTH
列のラベルと名前の両方を割り当てます。この場合は、補足情報を入れるために、1 つの列について SQLVAR の オカレンスが 2 つまたは 3 つ必要になります。この数は、結果表に特殊タイプが含まれるかどうかによって異なります。このような SQLVAR 配列の拡張を指定する場合は 、SQLN を 2×n または 3×n に設定してください。ここで、n は記述するオブジェクトの列の数です。各列ごとに、SQLVAR の最初の n 個のオカレンス (これは SQLVAR の基本項目です) に、列名が入ります。SQLVAR の 2 番目か 3 番目の n 個のオカレンス (これは拡張 SQLVAR 項目です) に、列ラベルが入ります。 特殊タイプがない場合、ラベルは SQLVAR 項目の 2 番目のセットに戻されます。それ以外の場合、ラベルは SQLVAR 項目の 3 番目のセットに戻されます。

REXX SQLDA には SQLN フィールドがありません。ですから、REXX プログラム には SQLN を設定する必要はありません。

ATTRIBUTES attr-host-variable
対応する属性が、関連付けられたステートメントの一部として指定されていない場合に、 有効な属性を指定します。 属性が、関連付けられたステートメントの一部として指定されている場合は、PREPARE ステートメントに指定された対応する属性の代わりにそれらの属性が使用されます。 逆に、 属性が SELECT ステートメントの PREPARE に指定されている場合、DECLARE CURSOR ステートメントに指定された対応する属性の代わりにそれらの属性が使用されます。

変更の始まりattr-host-variable は、ストリング変数の宣言規則に従って、プログラムに記述されているホスト変数を指定する必要があります。attr-host-variable は、32758 バイトを超えない長さ属性をもつストリング変数 (固定長または可変長) であることが必要です。前後のブランクはホスト変数の値 から除去されます。ホスト変数には有効な attribute-string が入っていなけ ればなりません。変更の終わり

標識変数は、属性が実際に PREPARE ステートメント上に提供されているかいないか を示すために使用することができます。これにより、属性を指定する必要があるかない かに関係なく、アプリケーションは同じ PREPARE ステートメントを使用することができます。

attribute-string の一部として指定できるオプションは次のとおりです。

ASENSITIVE、INSENSITIVE、SENSITIVE STATIC、または SENSITIVE DYNAMIC
結果表の基礎になる行に対して行われる挿入、更新、または削除にカーソルがセンシティブであるかどうかを指定します。カーソルのセンシティビティーは、DB2® が結果の行を一時表にマテリアライズできるかどうかを決定します。デフォルトは ASENSITIVE です。
ASENSITIVE
カーソルが可能な限りセンシティブ・カーソルになるように指定します。ASENSITIVE として定義されたカーソルは、インセンシティブまたはセンシティブ動的のどちらかになり、センシティブ静的にはなりません。GET DIAGNOSTICS ステートメントまたは SQLCA を使用して、カーソルの有効なセンシティビティーをアプリケーションに戻す方法については、OPENを参照してください。

変更の始まりカーソルのセンシティビティーがアクセス・パスの選択の要因になっています。 ASENSITIVE と指定するのではなく、必要とするセンシティビティー・レベルを明示的に指定してください。変更の終わり

INSENSITIVE
結果表の基礎になる行に対して行われる挿入、更新、または削除にカーソルがセンシティブでないことを指定します。 その結果、カーソルのオープン後は、結果表のサイズ、行の順序、および各行の値は、変わりません。また、カーソルは読み取り専用です。SELECT ステートメント、または PREPARE ステートメントの attribute-string には FOR UPDATE 文節を指定できず、またカーソルを位置付け UPDATE や位置付け DELETE のために使用することはできません。
SENSITIVE
結果表がマテリアライズされた後でデータベースに対して行われた変更を、カーソルが認識するように指定します。 カーソルは、同じカーソルを使用して行われる位置付け更新と位置付け削除に常にセンシティブです。 ただし、カーソルを SENSITIVE DYNAMIC または SENSITIVE STATIC のいずれかとして定義する場合、カーソルの select-statement に SQL データ変更ステートメントが含まれていてはいけません。 行の現行値が select-statement または statement-name の条件を満たさなくなると、その行はカーソルから可視ではなくなります。結果表の行が基礎となる基本表から削除されると、行はカーソルから可視ではなくなります。

また、カーソルは、カーソルの外部の値に対して行われた変更 (つまり、他のカーソルによる変更、または他のアプリケーション・プロセスによるコミット済みの変更) を認識します。 DB2 が、カーソルの外部で行われた変更をカーソルから可視にできない場合は、OPEN CURSOR 時にエラーが生じます。このカーソルの外部で行われた変更にカーソルがセンシティブであるかどうかは、カーソルに対して DYNAMIC または STATIC のどちらが有効か、および SENSITIVE または INSENSITIVE のどちらの FETCH ステートメントが使用されているかによって決まります。

新しく挿入された行をカーソルがセンシティブであるかどうかは、カーソルに対して DYNAMIC または STATIC のどちらが有効かによって決まります。 デフォルトは DYNAMIC です。

DYNAMIC
カーソルの結果表が動的になるように指定します。つまり、基礎表の行が挿入されたり削除されたりすると、結果表のサイズはカーソルのオープン後に変化する可能性があり、行の順序が変化する可能性があります。 同じアプリケーション・プロセスによって行われた挿入、削除、および更新は、即時に可視になります。他のアプリケーション・プロセスによって行われた挿入、削除、および更新は、これらがコミットされた後で可視になります。

センシティブ動的カーソルに対する FETCH ステートメントは、このカーソルによって行われた変更、同じアプリケーション・プロセス内で他のカーソルによって行われた変更、および他のアプリケーション・プログラムによって行われてコミットされた変更にセンシティブです。

SENSITIVE DYNAMIC カーソルが不可能な場合は、エラーが返されます。SENSITIVE DYNAMIC カーソルの最外部の全選択には、FETCH FIRST n ROWS ONLY 文節を指定できません。

STATIC
行の順序と結果表のサイズが静的であることを指定します。 カーソルがオープンされ、行がマテリアライズされた後、結果表のサイズは拡大しません。 行の順序は、結果表のマテリアライズ時に設定されます。基礎表に挿入された行は、行の挿入方法に関係なく、カーソルの結果表には追加されません。ORDER BY 文節の列が既にマテリアライズされている行で更新される場合、結果表の行は移動しません。

カーソルの外部で行われた変更がカーソルから可視かどうかは、SENSITIVE STATIC カーソルに対して使用される FETCH のタイプによって異なります。 詳しくは、センシティブ静的カーソルに対して使用される FETCH ステートメントに関する考慮事項を参照してください。

SENSITIVE STATIC カーソルの select-statement または statement-name の WHERE 文節で非 deterministic 関数 (組み込みまたはユーザー定義) を使用すると、誤った結果となる可能性があります。これは、DB2 が一時結果表を 作成し、INSENSITIVE FETCH ステートメントに対して、この表から行を取り出すことが原因で起こります。 DB2 が SENSITIVE FETCH ステートメントを処理するとき、行はその基礎表から フェッチされ、相関していない副照会が述部に含まれている場合にはその述部が再評価されます。非 deterministic 関数を使用すると、照会が再評価されるたびに異なる結果となり、行が一致していると見なされなくなります。

SENSITIVE STATIC を指定した場合にセンシティブ静的カーソルが使用不可ならば、エラーが戻されます。

ASENSITIVE、INSENSITIVE、SENSITIVE DYNAMIC、または SENSITIVE STATIC を ATTRIBUTES 文節の中で指定する場合は、SCROLL を指定する必要があります。

SCROLL または NO SCROLL
カーソルが両方向スクロール・カーソルかどうかを指定します。
SCROLL
カーソルが両方向スクロール・カーソルであることを指定します。
NO SCROLL
カーソルが順方向カーソルであることを指定します。
変更の始まりWITHOUT RETURN または WITH RETURN変更の終わり
変更の始まりプロシージャーから戻される結果セットとして、カーソルの結果表を使用するかどうかを指定します。 statement-name が指定されている場合、デフォルトはステートメントの対応する準備属性です。それ以外の場合、デフォルトは WITHOUT RETURN です。
WITHOUT RETURN
プロシージャーから戻される結果セットとして、カーソルの結果表を使用する意図はないことを指定します。
変更の始まりWITH RETURN変更の終わり
変更の始まりプロシージャーから戻される結果セットとして、カーソルの結果表を使用することを指定します。 WITH RETURN は、プロシージャーのソース・コード内に PREPARE ステートメントが含まれている場合にのみ関係します。その他の場合、プリコンパイラーがこの節を受け入れる可能性はありますが、その節に効果はありません。

WITH RETURN TO CALLER 文節を使用して宣言されたカーソルが、プログラムまたはルーチンの終了時にオープンしたままになっている場合、そのカーソルはそのプログラムまたはルーチンから結果セットを定義します。プログラムまたはルーチンからの結果セットにしないカーソルをクローズするには、CLOSE ステートメントを使用します。WITH RETURN 節を使用して宣言されていないカーソルは DB2 によってすべて自動的にクローズされますが、アプリケーションの移植性を高めるために CLOSE ステートメントの使用をお勧めします。

順方向カーソルの場合、結果セットの内容は、現行カーソル位置から結果表の最後までの行すべてです。両方向スクロール・カーソルの場合、結果セットの内容は結果表の行すべてです。

変更の始まりTO CALLER変更の終わり
変更の始まりカーソルが結果セットをプロシージャーの呼び出し元に戻すことができることを指定します。呼び出し元は、PREPARE ステートメントを含むプロシージャーを呼び出す SQL CALL ステートメントを実行したプログラムまたはルーチンです。例えば、呼び出し元がプロシージャーならば、結果セットはプロシージャーに戻されます。呼び出し元がクライアント・アプリケーションならば、結果セットはクライアント・アプリケーションに戻されます。

ステートメントがプロシージャーのソース・コードに含まれている場合に、WITH RETURN TO CALLER は、カーソルを結果セット・カーソルとして使用できることを指定します。 結果セット・カーソルは、カーソルの結果表がプロシージャーから返される場合に使用されます。TO CALLER の指定はオプションです。

その他の場合はこの文節が無視され、カーソルは、結果セット・カーソルとして使用できません。

変更の終わり
TO CLIENT
カーソルが結果セットをクライアント・アプリケーションに戻すことができることを指定します。このカーソルは、中間ネスト・プロシージャーからは参照できません。 関数またはトリガーがそのプロシージャーを呼び出す場合 (直接または間接のいずれか)、結果セットをクライアントに戻すことはできず、プロシージャーの終了後にカーソルはクローズされます。
変更の終わり
変更の終わり
rowset-positioning
このカーソルに対する単一の FETCH ステートメントによって、データ行に行セットとしてアクセスできるかどうかを指定します。
WITHOUT ROWSET POSITIONING
行位置付け FETCH ステートメントのみにカーソルを使用できるように指定します。
WITH ROWSET POSITIONING
行セット位置付け、または行位置付けの FETCH ステートメントにこのカーソルを使用できるように指定します。
fetch-first-clause
フェッチすることができる行の数を制限します。これにより、限られた数の行だけが必要なのに、結果セットが大きくなる可能性がある場合、照会のパフォーマンスが向上します。この文節を指定すると、取り出される行数は n (n は整数の値) を超えません。 n+1 行をフェッチしようとした場合、通常の日付の終わりと 同様に処理されます。integer の値は 1 以上でなければなりません。デフォルトは、1 です。

OPTIMIZE FOR 文節を指定しない場合は、デフォルトの OPTIMIZE FOR integer ROWS が想定されます。 FETCH FIRST および OPTIMIZE FOR 文節の両方が指定されると、これら文節の整数値の 小さい方を使って最適化と通信バッファー・サイズの設定が行われます。

SENSITIVE DYNAMIC カーソルの最外部の全選択には、FETCH FIRST 文節を指定できません。

read-only-clause
結果表が読み取り専用であり、位置付け UPDATE ステートメントおよび DELETE ステートメントでカーソルを参照することができないことを宣言します。
update-clause
後の位置付け UPDATE ステートメントの中で更新できる列を識別します。 各列は非修飾であり、全選択の最初の FROM 文節に指定された表またはビューの列を識別する ものでなければなりません。全選択の結果表が読み取り専用の場合は、この文節を指定してはなりません。作成済みの一時表が select-statement の最初の FROM 文節で参照される場合にも、 この文節は指定してはいけません。

列のリストを指定せずに UPDATE 文節を指定すると、更新できる列には、全選択の 最初の FROM 文節内で識別された、表またはビューのすべての更新可能な列が含まれます。

optimize-clause
select-statement の特別な最適化を要求します。この文節を省略すると、結果表のすべての行を取り出すという ことを前提にして最適化されます。 この文節を指定した場合は、取り出す行数 が n (n は 整数値) を超えないということを前提にして最適化されます。この文節は フェッチすることができる行の数を制限せず、またパフォーマンス以外に結果に影響を与えることもありません。
isolation-clause
変更の始まりSELECT ステートメントを実行する分離レベルを指定します。isolation-clauseを参照してください。変更の終わり
変更の始まりconcurrent-access-resolution変更の終わり
変更の始まりSELECT ステートメントに使用するタイプ並行アクセス解決を指定します。concurrent-access-resolution 内で各文節は 1 回だけ指定できます。PREPARE ステートメントごとに 1 つの文節のみ指定できます。文節を指定しないと、ロッキングのセマンティックはステートメントの他の属性に従属します。
SKIP LOCKED DATA
その他のトランザクションが互換性のないロックを保持しているデータをスキップするように指定します。SKIP LOCKED DATAを参照してください。
USE CURRENTLY COMMITTED
変更の始まりデータの更新処理中に、DB2 がそのデータの現在のコミット済みバージョンを使用できることを指定します。USE CURRENTLY COMMITTED は以下の場合のみ適用されます。
  • アクセスされる表が、ユニバーサル表スペース内で定義されている
  • ステートメントが、isolation-clause でカーソル固定 (CS) または読み取り固定 (RS) の分離レベルが指定されている select-statement である
    • 読み取りトランザクションが、挿入トランザクションでロックされているレコードにアクセスする際には、ISOLATION(CS) と ISOLATION(RS) の両方とも適用可能。
    • 読み取りトランザクションが、削除トランザクションでロックされているレコードにアクセスする際には、ISOLATION(CS) のみ適用可能で、CURRENTDATA(NO) が有効な場合のみ適用可能。

他のコンテキストで使用した場合、USE CURRENTLY COMMITTED は無視されます。

この節が指定されている場合、サブシステム・パラメーター EVALUNC の設定が適用されます。行が適格である場合、この節は行がアクセスされるかスキップされるかを決定します。

この節が指定されており、サブシステム・パラメーター SKIPUNCI が有効である場合、PREPARE ではこの節の指定が使用されます。詳しくは、『注』のセクションを参照してください。

変更の始まりこの文節を指定している場合に、複数の XML バージョンをサポートしていない XML データが選択されると、DB2 はそのデータがコミットされているかどうかを判別できません。この場合、DB2 はデータにアクセスする際に WAIT FOR OUTCOME 動作を使用します。変更の終わり

変更の終わり
WAIT FOR OUTCOME
更新処理中または削除処理中のデータを検出した場合に、DB2 がコミットまたはロールバックを待機することを指定します。挿入処理中の行はスキップされません。
変更の終わり
FOR MULTIPLE ROWS または FOR SINGLE ROW
動的 INSERT ステートメントまたは動的 MERGE ステートメントに対して可変数の行を提供するかどうかを指定します。
FOR MULTIPLE ROWS
準備されるステートメントの EXECUTE ステートメントに対して、ホスト変数配列を使用して複数の行を提供できることを指定します。FOR MULTIPLE ROWS は、INSERT ステートメントあるいは MERGE ステートメントの場合のみ指定できます。
FOR SINGLE ROW
準備されるステートメントの EXECUTE ステートメントに対して、ホスト変数配列を使用して複数の行を提供できないことを指定します。FOR SINGLE ROW は、INSERT ステートメントあるいは MERGE ステートメントの場合のみ指定できます。
ATOMIC または NOT ATOMIC CONTINUE ON SQLEXCEPTION
すべての行がアトミック操作で挿入されるかどうかを指定します。この文節は、動的 INSERT ステートメントに対してのみ指定できます。
ATOMIC
いずれかの行の挿入が失敗した場合には、挿入によって行ったデータベースの変更を、正常な挿入による変更を含めてすべて取り消すことを指定します。これはデフォルトです。
NOT ATOMIC CONTINUE ON SQLEXCEPTION
行のいずれかの挿入が失敗しても関係なく、INSERT ステートメントが、他の行を正常に挿入して行ったデータベースの変更を取り消さず、後続の行に対して挿入を試行することを指定します。 ただし、アトミシティの最低レベルは、INSERT ステートメントの結果として活動化された可能性のあるトリガーを含む、少なくとも単一の挿入のレベルです (つまり、不完全な挿入操作は完了できません)。

INSERT ステートメントが SELECT ステートメントに含まれている場合は、 この文節を指定してはいけません。

MERGE ステートメントを準備する場合、アトミシティは MERGE ステートメント自体にのみ指定できます。

変更の始まりWITHOUT EXTENDED INDICATORS または WITH EXTENDED INDICATORS変更の終わり
変更の始まりステートメントの実行時に標識変数に提供される値が、NULL 値を示す標準 SQL セマンティクスに従うのか、この値で拡張標識変数を使用して DEFAULT 値または UNASSIGNED 値を示すことができるのかを指定します。WITHOUT EXTENDED INDICATORS がデフォルトです。変更の終わり
変更の始まりCONCENTRATE STATEMENTS OFF または CONCENTRATE STATEMENTS WITH LITERALS変更の終わり
変更の始まりリテラル定数を指定する動的 SQL ステートメントの場合に、キャッシュ内の既存のステートメントを共有しないで、動的ステートメント・キャッシュ内に個別の固有ステートメント・エントリーとしてキャッシュするのかどうかを指定します。 動的 SQL ステートメントでは、キャッシュされているステートメントとは異なるリテラル定数を新規ステートメントで 1 つ以上指定している点を除いて、新規ステートメントが同じ動的ステートメントのキャッシュ・バージョンを共有する条件をすべて満たす場合に、キャッシュ内の既存のステートメントを共有できます。
CONCENTRATE STATEMENTS OFF
リテラル定数を指定する動的 SQL ステートメントが、同じ動的ステートメントのキャッシュ済みバージョンと異なる定数を 1 つ以上指定している場合に、固有ステートメント・エントリーとしてキャッシュすることを指定します。 CONCENTRATE STATEMENTS OFF が、動的ステートメントのキャッシング動作におけるデフォルトです。
CONCENTRATE STATEMENTS WITH LITERALS
リテラル定数を指定する動的 SQL ステートメントは、この新規動的ステートメントが、キャッシュ済みのステートメントを使用する条件をすべて満たし、指定された定数をキャッシュ済みステートメント内の定数に代えて再利用できる場合、同じく CONCENTRATE STATEMENTS WITH LITERALS オプションを使用して準備されている、同じ動的ステートメントのキャッシュ済みバージョンを共有することを指定します。
変更の終わり
FROM
ステートメント・ストリングを指定します。ステートメント・ストリングは、指定した string-expression ま たは指定した variable の値です。
host-variable
アプリケーション・プログラム内でストリング変数を宣言する際の規則に従 って記述されているホスト変数を示すものでなければなりません。 ソース・ストリングの長さが 32KB を超える場合、host-variable は CLOB 変数または DBCLOB 変数でなければいけません。2MB より大きいホスト変数を宣言できますが、ソース・ストリングの最大長は 2MB です。標識変数を指定してはなりません。PL/I、COBOL およびアセンブラー言語の場合、ホスト変数は可変長ストリング変数でなければなりません。C の場合、ホスト変数は NUL 終了ストリングであってはなりません。 SQL PL の場合、SQL 変数がホスト変数の代わりに使用され、その値が NULL であってはなりません。
string-expression
string-expression は、ストリングを生ずる PL/I の式です。string-expression の前にコロンを付けることはできません。演算子または関数を含んで いる string-expression の中の変数の前には、コロンを付けないでください。 string-expression が指定された場合、その string-expression のためのプリコンパイラー生成の構造体は EBCDIC CCSID を使用し、通知メッセージが戻されます。

ステートメント・ストリングに対する規則:
指定された statement-name の値をステートメント・ストリング と呼びます。ステートメント・ストリングは、以下のいずれかの SQL ステートメント でなければなりません。
ALLOCATE CURSOR
ALTER
ASSOCIATE LOCATORS
COMMENT
COMMIT
CREATE
DECLARE GLOBAL
    TEMPORARY TABLE
DELETE
DROP
EXPLAIN
FREE LOCATOR
GRANT
HOLD LOCATOR
INSERT
LABEL
LOCK TABLE
MERGE
REFRESH TABLE
RELEASE SAVEPOINT
RENAME
REVOKE
ROLLBACK
SAVEPOINT
select-statement
SET CURRENT DEGREE
SET CURRENT DEBUG MODE
SET CURRENT DECFLOAT
        ROUNDING MODE
SET CURRENT LOCALE LC_CTYPE
SET CURRENT MAINTAINED TABLE
        TYPES FOR OPTIMIZATION
SET CURRENT OPTIMIZATION HINT
SET CURRENT PRECISION
変更の始まりSET CURRENT QUERY ACCELERATION変更の終わり
SET CURRENT REFRESH AGE
SET CURRENT ROUTINE VERSION
SET CURRENT RULES
SET CURRENT SQLID
SET ENCRYPTION PASSWORD
SET PATH
SET SCHEMA
変更の始まりSET SESSION TIME ZONE変更の終わり
SIGNAL
TRUNCATE
UPDATE
ステートメント・ストリングは、次のことをしてはなりません。
  • EXEC SQL で始める。
  • END-EXEC またはセミコロンで終了する。
  • 変数に対する参照を含む。
パラメーター・マーカー:
ステートメント・ストリングには、変数に対する参照を入れることはできませんが、パラメーター・マーカー を入れることはできます。 パラメーター・マーカーは、準備済みステートメントの実行時に、変数の値によって置き換えられます。パラメーター・マーカーは疑問符 (?) であり、 ステートメント・ストリングが静的 SQL ステートメントであれば変数が現れる位置に、疑問符を入れることができます。

パラメーター・マーカーがどのように値に置き換えられるかについては 、EXECUTE ステートメントOPEN、および 「データ変更ステートメントの動的実行」を参照してください。

パラメーター・マーカーの 2 つのタイプは、以下に示すようにタイプ付きとタイプなしです。
タイプ付きパラメーター・マーカー
ターゲット・データ・タイプを付けて指定されるパラメーター・マーカー。タイプ付きパラメーター・マーカーの形式は一般的に次のとおりです。
   CAST(? AS data-type)
この CAST 指定の呼び出しは、実行時のパラメーターのデータ・タイプが、指定したデータ・タイプ、または指定したデータ・タイプに割り当て可能なデータ・タイプであるという「約束」です。 例えば、次の UPDATE ステートメントの中で、TRANSLATE 関数の引数は実行時に提供されます。
  UPDATE EMPLOYEE
    SET LASTNAME = TRANSLATE(CAST(? AS VARCHAR(12)))
   WHERE EMPNO = ?
TRANSLATE 関数に対して提供される値のデータ・タイプは、VARCHAR(12)、または VARCHAR(12) に変換できるいずれかのデータ・タイプになります。詳しくは、代入と比較を参照してください。

タイプ付きパラメーター・マーカーは、ホスト変数がサポートされ、 データ・タイプが CAST 指定で行われた約束に基づいている場合であれば、 動的 SQL ステートメントで使用することができます。

タイプなしパラメーター・マーカー
ターゲット・データ・タイプを付けずに指定されるパラメーター・マーカー。 タイプなしパラメーター・マーカーには、単一の疑問符という形式があります。パラメーター・マーカーが表示されるコンテキストによってそのデータ・タイプが決定されます。例えば、上記の UPDATE ステートメントでは、述部のタイプなしパラメーター・マーカーの データ・タイプは、EMPNO 列のデータ・タイプと同じです。

タイプなしパラメーター・マーカーは、ホスト変数がサポートされている選択されたロケーション における動的 SQL ステートメントで使用することができます。 表 1表 2表 3、 および 表 4 は、そうしたロケーションと、パラメーターの結果のデータ・タイプを示したものです。 表では、ロケーションを式、述部、関数、およびその他のステートメントのグループに分けて、タイプなしパラメーター・マーカーを使用できるロケーションを見やすくしています。

表 1. 式におけるタイプなしパラメーター・マーカーの使用 (選択リスト、CASE、および VALUES を含む)
タイプなしパラメーター・マーカーのロケーション データ・タイプ (またはサポートされていない場合はエラー)
選択リストの中で単独で使用。例えば、以下のようになります。
SELECT ?
エラー
演算子優先順位と操作の順序規則を考慮後、単一算術演算子の両オペランドとして使用。次のようなケースがあります。
? + ? + 10
DECFLOAT(34)
算術式 (日時算術式を除く) における単一オペレーターの 1 オペランドとして使用。次のようなケースがあります。
? + ? * 10
他のオペランドのデータ・タイプ。
日時式のオペランドとして使用。例えば、以下のようになります。
'timecol + ?' or '? - datecol'
エラー
変更の始まり単位のタイプが SECONDS 以外の、日時式におけるラベル付き期間 (単位のタイプをパラメーター・マーカーにすることができないことを示すラベル付き期間の部分) で使用。変更の終わり 変更の始まりDECIMAL(15,0)変更の終わり
変更の始まり単位のタイプが SECONDS の、日時式におけるラベル付き期間 (単位のタイプをパラメーター・マーカーにすることができないことを示すラベル付き期間の部分) で使用。変更の終わり 変更の始まりDECIMAL(27,12)変更の終わり
CONCAT 演算子の両オペランドとして使用。 エラー
他のオペランドが CLOB 以外の文字データ・タイプである場合に、CONCAT 演算子 の 1 オペランドとして使用。 他のオペランドが CHAR(n) または VARCHAR(n) の場合 (n は 128 未満)、 データ・タイプは VARCHAR(254 - n)。それ以外の場合はすべて、データ・タイプは VARCHAR(254)。
他のオペランドが DBCLOB 以外のグラフィック・データ・タイプである場合に、 CONCAT 演算子の 1 オペランドとして使用。 他のオペランドが GRAPHIC(n) また は VARGRAPHIC(n) の場合 (n は 64 未満)、 データ・タイプは VARGRAPHIC(127 - n)。それ以外の場合はすべて、データ・タイプは VARGRAPHIC(127)。
他のオペランドが BLOB 以外のバイナリー・タイプである場合に、 CONCAT 演算子の 1 つのオペランドとして使用。 他のオペランドが BINARY(n) または VARBINARY(n) の場合 (n は 128 未満)、 データ・タイプは VARBINARY(255-n)。それ以外の場合はすべて、データ・タイプは VARBINARY(255)。
他のオペランドが LOB ストリングである場合に、CONCAT 演算子の 1 オペランドとして使用。 他のオペランド (LOB ストリング) のデータ・タイプ。
単純な CASE 式の CASE キーワードに続く で使用。 エラー
単純な CASE 式の WHEN キーワードに続く、いずれかまたは すべての で使用。 CASE に続く式、およびタイプなしパラメーター・マーカーではない WHEN に続く 式に 結果のデータ・タイプの規則を適用した結果。
他の結果式 がすべて NULL またはタイプなしパラメーター・マーカーの いずれかである場合、いずれかの CASE 式の結果式 で使用。 エラー
他の結果式 のうちの少なくとも 1 が NULL でもなく、 タイプなしパラメーター・マーカーでもない場合に、 いずれかの CASE 式の結果式 で使用。 NULL でもタイプなしパラメーター・マーカーでもないすべての結果式 に、結果のデータ・タイプの規則を適用した結果。
INSERT ステートメントの中にない単一行の VALUES 文節、あるいは MERGE ステートメントの挿入操作の VALUES 文節で、column-expression として単独で使用。 エラー
INSERT ステートメントの中にある単一行の VALUES 文節で 、column-expression として単独で使用。 列のデータ・タイプ、または、列が特殊タイプとして定義されている場合はその特殊タイプのソース・データ・タイプ。
MERGE ステートメントに対する source-tablevalues-single-row 文節または values-multiple-row 文節で 、column-expression として単独で使用。 ソース表の列のデータ・タイプ、または、データ・タイプが特殊タイプである場合はその特殊タイプのソース・データ・タイプ。ソース表の列は、そのデータ・タイプが使用されるコンテキストから決定できるように、MERGE ステートメントの他のどこででも参照されなければならず、また、そのような参照はすべて同じデータ・タイプに解決されなければなりません。
MERGE ステートメントの挿入操作の VALUES 文節で、column-expression として単独で使用。 列のデータ・タイプ、または、列が特殊タイプとして定義されている場合はその特殊タイプのソース・データ・タイプ。
MERGE ステートメントの更新操作の場合に、assignment-clause の右側で 、column-expression として単独で使用。 列のデータ・タイプ、または、列が特殊タイプとして定義されている場合はその特殊タイプのソース・データ・タイプ。
UPDATE ステートメントの SET 文節の右側で、column-expression として単独で使用。 列のデータ・タイプ、または、列が特殊タイプとして定義されている場合はその特殊タイプのソース・データ・タイプ。
表 2. 述部におけるタイプなしパラメーター・マーカーの使用
タイプなしパラメーター・マーカーのロケーション データ・タイプ (またはサポートされていない場合はエラー)
比較演算子の両オペランドとして使用。 エラー
他のオペランドがタイプなしパラメーター・マーカーではない場合に、 比較演算子の 1 オペランドとして使用。 他のオペランドのデータ・タイプ。そのオペランドが日時データ・タイプの場合 、DESCRIBE INPUT の結果は、DB2 が比較で 日時データ・タイプを使用していても、データ・タイプを CHAR(255) と表示します。
BETWEEN 述部のすべてのオペランドで使用。 エラー
BETWEEN 述部の 2 つのオペランド (第 1 と第 2、または第 1 と第 3) で使用。 パラメーター・マーカーではないオペランドのデータ・タイプ。
BETWEEN 述部の唯一のオペランドで使用。 パラメーター・マーカーではない他のオペランドに 結果のデータ・タイプの規則を適用した結果。
IN 述部のすべてのオペランドとして使用。例えば、 ? IN (?,?,?) エラー
IN 述部の第 1 オペランドと第 2 オペランドで使用。 例えば、? IN (?,A,B) パラメーター・マーカーではない IN リストのオペランド に 結果のデータ・タイプの規則を適用した結果。
IN 述部の第 1 オペランド、および IN リストの第 1 オペランドを除く 、IN リストのゼロまたは複数のオペランドとして使用。 例えば、? IN (A,?,B,?) パラメーター・マーカーではない IN リストのオペランド に 結果のデータ・タイプの規則を適用した結果。
右側が全選択の全選択である場合、IN 述部の第 1 オペランドとして使用。 例えば、? IN (fullselect) 選択された列のデータ・タイプ。
IN 述部の IN リストのいずれかまたはすべてのオペランド、 およびタイプなしパラメーター・マーカー ではない IN 述部の第 1 オペランドとして使用。 例えば、A IN (?,A,?) 第 1 オペランド (IN リストの左側にあるオペランド) のデータ・タイプ。
LIKE 述部のすべてのオペランドで使用。 第 1 オペランドと第 2 オペランド (一致式 パターン式) は VARCHAR(4000)。 第 3 オペランド (エスケープ式) は VARCHAR(1)。
他のオペランド (パターン式 また はエスケープ式 ) のうちの少なくとも 1 つが タイプなしパラメーター・マーカーでない場合に、LIKE 述部の第 1 オペランド (一致式) で使用。 VARCHAR(4000)、VARGRAPHIC(2000)、または VARBINARY(4000) のいずれか。 タイプなしパラメーター・マーカーではない第 1 オペランドのデータ・タイプによって決まります。
他のオペランド (一致式 またはエスケープ式) のうちの少なくとも 1 つが タイプなしパラメーター・マーカーでない場合に、LIKE 述部の第 2 オペランド (パターン式) で使用。LIKE 述部で指定されたパターンがパラメーター・マーカーであり、固定長の文字ホスト 変数を使用してパラメーター・マーカーを置き換えるという場合は、ホスト変数に関す る正しい長さの値を指定してください。 正しい長さを指定しないと、この選択では、意図した結果は戻されません。 VARCHAR(4000)、VARGRAPHIC(2000)、または VARBINARY(4000) のいずれか。 タイプなしパラメーター・マーカーではない第 1 オペランドのデータ・タイプによって決まります。
他のオペランド (一致式 またはパターン式) のうちの少なくとも 1 つがタイプなしパラメーター・マーカーでない場合に、LIKE 述部の第 3 オペランド (エスケープ式) で使用。 CHAR(1)、GRAPHIC(1)、または BINARY(1) のいずれか。タイプなしパラメーター・マーカーではない第 1 オペランドのデータ・タイプによって決まります。
NULL 述部のオペランドで使用。 エラー
表 3. 関数におけるタイプなしパラメーター・マーカーの使用
タイプなしパラメーター・マーカーのロケーション データ・タイプ (またはサポートされていない場合はエラー)
COALESCE または NULLIF のすべての引数で使用。 エラー
他の引数のうち少なくとも 1 つがタイプなしパラメーター・マーカーでない場合 に、COALESCE または NULLIF の引数で使用。 タイプなしパラメーター・マーカーではない引数に 結果のデータ・タイプの規則を適用した結果。
COLLATION_KEY の第 1 引数として使用。 VARGRAPHIC(2000)
COLLATION_KEY の第 2 引数として使用。 VARCHAR(255)
LOWER の第 1 引数として使用。 VARCHAR(4000)
LOWER の第 2 引数として使用。 VARCHAR(255)
MAX の第 1 引数以外の任意の引数として使用。 関数インスタンスの中で対応するパラメーターのデータ・タイプ。
MIN の第 1 引数以外の任意の引数として使用。 関数インスタンスの中で対応するパラメーターのデータ・タイプ。
POSSTR または POSITION の両引数として使用。 両引数とも VARCHAR(4000)。
他の引数が文字データ・タイプである場合 、POSSTR または POSITION の 1 つの引数として使用。 VARCHAR(4000)
他の引数がグラフィック・データ・タイプである場合 、POSSTR または POSITION の 1 つの引数として使用。 VARGRAPHIC(2000)
他の引数が BINARY データ・タイプまたは VARBINARY データ・タイプである場合 、POSSTR または POSITION の 1 つの引数として使用。 VARBINARY(4000)
他の引数が BLOB である場合、POSSTR または POSITION の 1 つの引数として使用。 BLOB(4000)
SUBSTR または SUBSTRING の 1 番目の引数として使用。 VARCHAR(4000)
SUBSTR または SUBSTRING の 2 番目または 3 番目 の引数として使用。 INTEGER
TIMESTAMP の 1 つの引数として使用。 TIME
TIMESTAMP_FORMAT の第 1 引数として使用。 VARCHAR(255)
TRANSLATE の第 1 引数として使用。 エラー
TRANSLATE の第 2 または第 3 引数として使用。 VARCHAR(4000) または VARGRAPHIC(2000)。第 1 引数のデータ・タイプが文字かグラフィックかによって決まります。
TRANSLATE の第 4 引数として使用。 VARCHAR(1) または VARGRAPHIC(1)。第 1 引数のデータ・タイプが 文字かグラフィックかによって決まります。
UPPER の第 1 引数として使用。 VARCHAR(4000)
UPPER の第 2 引数として使用。 VARCHAR(255)
VARCHAR_FORMAT の第 1 引数として使用。 変更の始まりTIMESTAMP WITHOUT TIME ZONE変更の終わり
単項減算で使用。 変更の始まりDECFLOAT(34)変更の終わり
単項加算で使用。 変更の始まりエラー変更の終わり
すべての組み込みスカラー関数の引数 (この表で記述したもの以外) として使用。 エラー
組み込み集約関数の引数として使用。 エラー
ユーザー定義のスカラー関数、ユーザー定義の集約関数、ユーザー定義の表関数の引数として使用。 関数インスタンスの中で対応するパラメーターのデータ・タイプ。
表 4. ステートメントにおけるタイプなしパラメーター・マーカーの使用
タイプなしパラメーター・マーカーのロケーション データ・タイプ (またはサポートされていない場合はエラー)
INSERT ステートメントまたは MERGE ステートメントの FOR n ROWS 文節 整数
UPDATE ステートメントの SET 文節あるいは MERGE ステートメントの UPDATE 文節の右側の値 ソース表の列のデータ・タイプ、または、列が特殊タイプとして定義されている場合はその特殊タイプのソース・データ・タイプ。ソース表の列は、そのデータ・タイプが使用されるコンテキストから決定できるように、MERGE ステートメントの他のどこででも参照されなければならず、また、そのような参照はすべて同じデータ・タイプに解決されなければなりません。
変更の始まり期間指定または期間節の、valuevalue1、または value2変更の終わり 変更の始まり期間指定または期間節で参照される期間の列のデータ・タイプ変更の終わり
センシティブ静的カーソルに対して使用される FETCH ステートメントに関する考慮事項:
カーソルの外部で行われた変更がカーソルから可視かどうかは、SENSITIVE STATIC カーソルに対して使用される FETCH のタイプによって異なります。
  • SENSITIVE FETCH は、このカーソルによって行われるすべての更新と削除 (トリガーによって行われる変更を含む)、および他のすべてのアプリケーション・プログラムによるコミット済みの更新と削除にセンシティブです。これは、フェッチされる行がすべて一時表でなく基礎となる基本表から取り出されるためです。 これは、SENSITIVE カーソルに対する FETCH ステートメントのデフォルト・タイプです。

    このカーソルを使用して基礎のデータに変更を加えると、行の自動リフレッシュが行われます。 このタイプのカーソルを使用して行われた変更が原因で、カーソルの結果表にホールが生じる可能性があります。また、行の再フェッチ (既に取り出し済みの行を取り出すこと) を行うと、結果表にホールが生じる可能性があります。センシティブ FETCH を発行して行の再フェッチを行い、その行が照会の検索条件を満たさなくなると、「削除ホール」または「更新ホール」が生じます。 この場合、データは戻されず、カーソルはホールに位置付けられたままになります。

  • INSENSITIVE FETCH は、このカーソルの外部で行われた更新と削除にセンシティブではありませんが、このカーソルによって行われたすべての更新と削除にセンシティブです。 トリガーによって行われた変更は、行の内容が結果表の中で SENSITIVE FETCH ステートメントによって更新されるまで、INSENSITIVE FETCH からは不可視です。このカーソルの外部で行われた変更にセンシティブでないようにアプリケーションを設定したい場合は (つまり、アプリケーションが、別のカーソルまたは別のアプリケーション・プログラムによって行われた変更にセンシティブでないようにする)、SENSITIVE STATIC カーソルの FETCH ステートメントの中で INSENSITIVE を明示的に指定できます。このタイプの FETCH は、ユーザー・データ・バッファー内のデータをリフレッシュする際に便利です。詳しくは、INSENSITIVE を参照してください。
エラーの検査:
PREPARE ステートメントを実行すると、ステートメント・ストリングが解析され、エラーの検査を受けます。ステートメント・ストリングが無効であれば、 準備済みステートメントは作成されず、その作成を妨げることに なったエラー状態が SQLCA に報告されます。

ローカル処理およびリモート処理中に、DEFER(PREPARE) と REOPT(ALWAYS)/REOPT(ONCE) のバインド・オプションを使用すると、一部の SQL ステートメントが「遅延」エラーを受け取ることがあります。例えば DESCRIBE、EXECUTE、および OPEN は 、通常 PREPARE 処理中に生じる SQLCODE を受け取ることがあります。

参照と実行規則:
準備済みステートメントは、次のような種類のステートメントで参照できますが、制約事項があります。
ステートメントのタイプ 準備済みステートメントの制約事項
DESCRIBE 制約事項はありません
DECLARE CURSOR カーソルをオープンするときは、ステートメントは SELECT でなければなりません
EXECUTE ステートメントは SELECT であってはなりません

準備済みステートメントは何回でも実行できます。実際に、 準備済みステートメントが 1 回しか実行されない場合には、 そのステートメントにパラメーター・マーカーが含まれていなければ 、PREPARE ステートメントと EXECUTE ステートメントではなく 、EXECUTE IMMEDIATE ステートメントを使う方が効率的です。

準備済みステートメントの永続性:
作業単位によって作成された準備済みステートメントは、作業単位が終了するとすべて破棄されます。ただし、次の例外があります。
  • SELECT ステートメントのカーソル が WITH HOLD オプションを指定して宣言されている場合は、コミット操作の 実行時にカーソルがオープンしていれば、その SELECT ステートメントは コミット操作の実行後も持続します。
  • システムで動的ステートメント・キャッシングを使用でき、以下のいずれも真でない場合は、KEEPDYNAMIC(YES) を使用してバインドされた SELECT、INSERT、UPDATE、MERGE、および DELETE ステートメントはコミット・ポイントを過ぎても保持されます。
    • その場所で SQL RELEASE が出された。
    • バインド・オプション DISCONNECT(AUTOMATIC) が使用された。
    • バインド・オプション DISCONNECT(CONDITIONAL) が使用され、 その場所で保持されたカーソルがない。
ステートメント名の有効範囲:
statement-name の有効範囲は、cursor-name の有効範囲と同じです。cursor-name の有効範囲について詳しくは、DECLARE CURSORを参照してください。
PREPARE INTO および REOPT のバインド・オプションを使用した準備:
バインド・オプション REOPT(ALWAYS) または REOPT(ONCE) が有効になっている場合、PREPARE INTO は PREPARE および DESCRIBE の実行と等価です。ステートメントに入力変数がある場合は、DESCRIBE がステートメントにデフォルト値 を提供し、ステートメントをオープンまたは実行するときに 再び準備する必要があります。REOPT(ONCE) が有効になっている場合に、入力変数がなければ、ステートメントは必ず 2 回準備されます。このため、ステートメントが 2 回準備されないように、REOPT(ALWAYS) または REOPT(ONCE) が有効になっている場合は、PREPARE INTO の使用を避けてください。
PREPARE ステートメントと SELECT または DECLARE CURSOR ステートメントのカーソル属性の関係:
select-statement の一部として指定されるカーソル属性は、PREPARE 上の ATTRIBUTES 文節を使って指定されている、対応するオプションの代わりに使用されます。 PREPARE の ATTRIBUTES 文節の一部として指定されている属性は 、DECLARE CURSOR ステートメントを使って 指定されているどのオプションにも優先します。カーソル属性の使用順序は以下の通りです。
  • SELECT (優先順位が一番高い)
  • PREPARE ステートメント ATTRIBUTES 文節
  • DECLARE CURSOR (優先順位が一番低い)
例えば、ホスト変数 MYQ が以下の SELECT ステートメントに設定されている と想定しましょう。
      SELECT WORKDEPT, EMPNO, SALARY, BONUS, COMM
           FROM EMP
          WHERE WORKDEPT IN ('D11', 'D21')
          FOR UPDATE OF SALARY, BONUS, COMM
以下の PREPARE ステートメントが発行された場合には、PREPARE ステートメントの一部として ATTRIBUTES と一緒に指定される FOR READ ONLY 文節の代わり に、SELECT ステートメントの一部として指定される FOR UPDATE 文節が使用されます。したがって、カーソルは更新可能となります。
     attrstring = 'FOR READ ONLY';
     EXEC SQL PREPARE stmt1 ATTRIBUTES :attrstring FROM :MYQ;
変更の始まりCURRENT EXPLAIN MODE 特殊レジスターの影響:変更の終わり
変更の始まりCURRENT EXPLAIN MODE 特殊レジスターを EXPLAIN に設定すると、SET ステートメント以外のステートメントは EXPLAIN 専用に準備されるので、実行可能ではありません。準備されたステートメントを実行しようとすると、エラーが戻されます。詳しくは、CURRENT EXPLAIN MODEの特殊レジスターを参照してください。変更の終わり
位置決め更新に関する SELECT と UPDATE WHERE CURRENT OF の属性の優先順位:
UPDATE WHERE CURRENT OF ステートメントと、関連付けられている SELECT ステートメントの両方とも準備され、両方のステートメントに同じ PREPARE 属性がある場合は、UPDATE WHERE CURRENT OF ステートメントの PREPARE 属性の値が SELECT ステートメントの PREPARE 属性の値をオーバーライドします。
動的に実行される位置決め更新に対する拡張標識 PREPARE 属性の影響:
WHERE CURRENT OF 文節を指定した UPDATE ステートメントと、関連付けられている SELECT ステートメントを両方とも準備している場合、拡張標識変数を使用するかどうかは、各 PREPARE ステートメント内の WITH EXTENDED INDICATORS 属性または WITHOUT EXTENDED INDICATORS 属性に応じて異なります。
表 5. SELECT ステートメントと UPDATE ステートメントの PREPARE ステートメントの EXTENDED INDICATOR 属性間の相互作用
SELECT ステートメントの PREPARE の拡張標識属性 WHERE CURRENT OF 文節を指定した UPDATE ステートメントの PREPARE の拡張標識属性 結果
WITH EXTENDED INDICATORS WITH EXTENDED INDICATORS UPDATE ステートメントの PREPARE 属性が、SELECT ステートメントの PREPARE 属性をオーバーライドします。選択リスト内に更新不能列が含まれる可能性があります。
WITH EXTENDED INDICATORS WITHOUT EXTENDED INDICATORS UPDATE ステートメントは拡張標識パラメーターなしに実行されます。
WITH EXTENDED INDICATORS デフォルト (属性の指定なし) SELECT ステートメントの PREPARE 属性が、UPDATE ステートメントのデフォルトの PREPARE 属性をオーバーライドします。選択リスト内に更新不能列が含まれる可能性があります。
WITHOUT EXTENDED INDICATORS WITH EXTENDED INDICATORS UPDATE ステートメントの PREPARE 属性が、SELECT ステートメントの PREPARE 属性をオーバーライドします。暗黙的または明示的な選択リスト内に更新不能列は含まれません。
WITHOUT EXTENDED INDICATORS WITHOUT EXTENDED INDICATORS UPDATE ステートメントは拡張標識パラメーターなしに実行されます。
WITHOUT EXTENDED INDICATORS デフォルト (属性の指定なし) SELECT ステートメントの PREPARE 属性が、UPDATE ステートメントのデフォルトの PREPARE 属性をオーバーライドします。UPDATE ステートメントは拡張標識パラメーターなしに実行されます。
デフォルト (属性の指定なし) WITH EXTENDED INDICATORS UPDATE ステートメントの PREPARE 属性が、SELECT ステートメントの PREPARE 属性をオーバーライドします。暗黙的または明示的な選択リスト内に更新不能列は含まれません。
デフォルト (属性の指定なし) WITHOUT EXTENDED INDICATORS UPDATE ステートメントの PREPARE 属性が、SELECT ステートメントの PREPARE 属性をオーバーライドします。UPDATE ステートメントは拡張標識パラメーターなしに実行されます。
デフォルト (属性の指定なし) デフォルト (属性の指定なし) UPDATE ステートメントは拡張標識パラメーターなしに実行されます。
SKIPUNCI サブシステム・パラメーターと PREPARE ステートメントの間の相互作用:
CURRENTLY COMMITTED 文節または WAIT FOR OUTCOME 文節のいずれかを指定して PREPARE ステートメントが指定され、サブシステム・パラメーター SKIPUNCI が有効である場合、次の表に、コミットされていない挿入をスキップするかどうか、またはトランザクションがコミットまたはロールバックを待機してから実行するかどうかを記述します。
表 6. SKIPUNCI サブシステム・パラメーターと PREPARE ステートメントの間の相互作用
SKIPUNCI
サブシステム・
パラメーターの値
PREPARE ステートメントの属性
コミットされていない挿入を
スキップ、
コミットまたは
ロールバックを
待機
YES CURRENTLY COMMITTED スキップ
YES WAIT FOR OUTCOME 待機
YES 指定しない スキップ
NO CURRENTLY COMMITTED スキップ
NO WAIT FOR OUTCOME 待機
NO 指定しない 待機
拡張標識変数と据え置きエラー・チェック:
拡張標識変数が使用可能になっている場合は、未割り当ての標識値があると、関連付けられているターゲット列がステートメントから省かれます。そのため、(更新不能列への INSERT または更新不能列の UPDATE を認識するために) 通常はステートメントの準備中に行われる妥当性検査は、ステートメントの実行まで据え置かれます。ステートメントの検証に失敗する場合、エラーは、ステートメントの準備時ではなく実行時に返されます。
CONCENTRATE STATEMENTS WITH LITERALS を使用する動的ステートメント・キャッシュ内での準備済みステートメントの再利用:
定数を再利用できるようになるには、新しいステートメントとキャッシュ済みステートメントの両方の定数が、以下の点で共通している必要があります。
  1. 即時使用コンテキスト
  2. データ・タイプ
  3. データ・タイプの長さおよびサイズ

定数の両方のインスタンスが再利用の基準を満たすと DB2 が判定した場合は、CONCENTRATE STATEMENTS WITH LITERALS オプションを使用して準備されたキャッシュ済みステートメントを、定数が異なる同じ SQL ステートメントで共有できます。新規動的 SQL ステートメントでは、キャッシュ済みステートメントを共有しますが、新規ステートメントの実行時にステートメントで使用されるのは、キャッシュ済みステートメントの定数ではなく、新規ステートメント自体のリテラル定数です。

ただし、例外がいくつかあります。例えば、組み込み関数 SUBSTR の場合に異なる定数値を使用するキャッシュ済みステートメント内の定数を再利用する場合は、即時利用コンテキストの関係から、正しくない出力または結果を戻すリスクが伴います。この場合は、キャッシュ済みバージョンのステートメントと完全に同じ定数値を持つ SQL ステートメント・インスタンスの場合のみ再利用が可能です。DB2 では、この即時使用コンテキストの制限が適用される条件と適用先を判定します。

変更の始まりCONCENTRATE STATEMENTS WITH LITERALS オプションを指定すると、DB2 は、REOPT(ONCE) または REOPT(AUTO) バインド・オプションによってバインドされているステートメントに限り、アクセス・パス選択に関してリテラル定数の値を考慮します。変更の終わり

DECFLOAT で定義されている定数 NAN、SNAN、および INFINITY は、リテラル定数の再利用に適用できます。

次の例は、CONCENTRATE STATEMENTS WITH LITERALS と組み合わせて PREPARE を使用する方法を示します。X、Y、および Z は、DECIMAL データ・タイプで定義されている列です。
DECLARE C1 CURSOR
	FOR DYNSQL_WITH_LITERAL;

DYNSQL_SELECT = ‘SELECT X, Y, Z 
								FROM TABLE1 
								WHERE X < 9';

attrstring = ‘CONCENTRATE STATEMENTS WITH LITERALS';

EXEC SQL PREPARE DYNSQL_WITH_LITERAL 
	ATTRIBUTES :attrstring 
	FROM :DYNSQL_SELECT;

EXEC SQL OPEN C1;
DYNSQL_INSERT = ‘INSERT INTO 
								TABLE1 (X, Y, Z) 
								VALUES (8,109,29)';

attrstring = ‘CONCENTRATE STATEMENTS WITH LITERALS';

EXEC SQL PREPARE DYNSQL_INSERT_WITH_LITERAL
	 ATTRIBUTES :attrstring
	 FROM :DYNSQL_INSERT;

EXEC SQL EXECUTE DYNSQL_INSERT_WITH_LITERAL;

例 1: この PL/I の例では、パラメーター・マーカーを 持つ INSERT ステートメント が準備され、実行されます。実行に先立ち、パラメーター・マーカーの値が、ホスト変数 S1、S2、S3、S4、S5 に読み込まれます。
   EXEC SQL PREPARE DEPT_INSERT FROM
     'INSERT INTO DSN8A10.DEPT VALUES(?,?,?,?,?)';
   -- Check for successful execution and read values into host variables
   EXEC SQL EXECUTE DEPT_INSERT USING :S1, :S2, :S3, :S4, :S5;
例 2:PREPARE ステートメント上のホスト変数で カーソルの属性を指定して、動的 SELECT ステートメントを準備します。SELECT ステートメントのテキストが stmttxt という名前の変数にあり、カーソルの属性が attrvar という名前の変数にあると想定します。
     EXEC SQL DECLARE mycursor CURSOR FOR mystmt;
     EXEC SQL PREPARE mystmt ATTRIBUTES :attrvar
                 FROM :stmttxt;
     EXEC SQL DESCRIBE mystmt INTO :mysqlda;
     EXEC SQL OPEN mycursor;
     EXEC SQL FETCH FROM mycursor USING DESCRIPTOR :mysqlda;
1 カーソルのスクロール可能性とセンシティビティーは独立しており、一緒に指定する必要はありません。そのため、カーソルは SCROLL INSENSITIVE と 定義されているのに、PREPARE ステートメントはセンシティビティーのオーバーライドとして SENSITIVE STATIC を指定している場合があります。