FETCH ステートメント
FETCH ステートメントは、結果表の行にカーソルを置きます。 このステートメントは、行を戻さないか、1 行、または複数行を戻し、またターゲットの指定があれば、行の値を変数に割り当てます。
呼びかけ FETCH
このステートメントは、アプリケーション・プログラムに組み込む方法のみ可能です。 これは、動的に作成できない実行可能ステートメントです。 REXX、 Fortran、SQLプロシージャアプリケーション1 では、複数行のフェッチはサポートされていません。 REXXでは、WITH CONTINUE句を持つFETCH文はサポートされていません。
承認 FETCH
カーソルを使用するために必要な権限の説明については、DECLARE CURSOR 文を参照してください。
グローバル変数、または配列グローバル変数のエレメントへの割り当ての場合、特権セットには、少なくとも次のいずれかが含まれていなければなりません。

- 変数に対する WRITE 特権
- 変数の所有権
- DATAACCESS 権限
- SYSADM 権限

遷移変数への割り当ての場合、特権セットには、少なくとも次のいずれかが含まれていなければなりません。

- 割り当てステートメントを含むトリガーが定義されている表またはビューに対する UPDATE 特権
- 値が割り当てられる遷移変数に対応する列に対する UPDATE 特権
- 割り当てステートメントを含むトリガーが定義されている表またはビューの所有権
- 割り当てステートメントを含むトリガーが定義されている表が含まれているデータベースに対する DBADM 権限
- DATAACCESS 権限
- SYSADM 権限

特権セット:
アプリケーション・プログラムにこの
ステートメントを組み込む場合、特権セットは、パッケージの所有者が持つ特権となります。 文が動的に準備される場合、権限セットは有効なDYNAMICRULESの動作(run、bind、define、またはinvoke)によって決定され、 DYNAMICRULESの動作と権限チェックにまとめられています。 これらの動作を決定するDYNAMICRULESバインドオプション値の一覧など、 これらの動作の詳細については、 認可IDと動的SQLを参照してください。
構文 FETCH
- 1 初期設定はカーソルの感度によって異なります。 DECLARE CURSOR の指定が INSENSITIVE になっていると、デフォルトは INSENSITIVE となり、DECLARE CURSOR の指定が SENSITIVE になっていると、デフォルトは SENSITIVE となります。
- 2 INSENSITIVEまたはSENSITIVEが指定された場合、 単一行フェッチまたは複数行フェッチを指定する必要があります。
- 3 WITH CONTINUE が指定された場合は、 単一行フェッチを指定する必要があります。
- 4 複数行フェッチが指定された場合、 行セット位置指定のフェッチ方向も指定しなければなりません。
fetch-orientation
- 1 BEFOREまたはAFTERが指定された場合、SENSITIVE、INSENSITIVE、 単一列取得、または複数列取得を指定してはならない。
- 2 複数行フェッチが指定されていない場合のみ、行位置指定のフェッチ方向を指定できます。
- 3 複数行フェッチが指定された場合、行セット位置指定のフェッチ方向も指定する必要があります。
取得タイプ
- 1 単一列フェッチの場合、ホスト変数配列をホスト変数の代わりに指定することができます。 記述子によってホスト変数配列を記述することもできます。 どちらの場合も、ホスト変数配列の最初にある項目のデータのみが戻されます。
- 2 アレイ要素は、SQL PL コンテキストでのみ指定できます。
- 3 配列グローバル変数は、SQL PL コンテキストでのみ指定する必要があります。
- 4 この条項は、 行位置指定の取得方向の場合、または取得方向が指定されていない場合は指定してはならない。
- 5 この条項は任意です。 この文節を指定しない場合に、行セット・サイズがまだ設定されていないか、このカーソルに対して最後に発行された FETCH ステートメントのタイプが行位置付け FETCH ステートメントである場合、行セット・サイズは暗黙的に指定されます。 このカーソルに対して最後に発行された FETCH ステートメントが行セット位置付け FETCH ステートメントである場合に、この文節が指定されていなければ、行セット・サイズは直前の行セット位置付け FETCH と同じサイズになります。
説明の対象: FETCH
- INSENSITIVE
- 結果表から行をそのままの状態で戻します。 行が以前に
FETCH SENSITIVE を使って取り出されている場合、それは、FETCH SENSITIVE ステート
メントの発行前にこのカーソルの外側で行われた変更を反映します。 位置付け UPDATE または位置付け DELETE に対して同じカーソルが使用された場合には、位置付け UPDATE および位置付け DELETE は FETCH INSENSITIVE を使って反映されます。
INSENSITIVEは、INSENSITIVEまたはSENSITIVE STATICとして宣言されたカーソルに対してのみ指定できます(または、カーソルがASENSITIVEとして宣言されている場合、 Db2 はデフォルトでINSENSITIVEになります)。 そうでなければ、カーソルが SENSITIVE DYNAMIC として宣言されている場合(または、カーソルが ASENSITIVE として宣言されている場合、および Db2 が SENSITIVE DYNAMIC にデフォルト設定されている場合)、エラーが発生し、FETCH 文は効果を持ちません。 INSENSITIVE カーソルの場合 、INSENSITIVE がデフォルトなので、それを指定することは任意です。
- SENSITIVE
- カーソルの SELECT ステートメントの基本表の中の対応する行から、結果表の中
の、フェッチした行を更新して、現在の値を戻します。 こうすることにより、このカーソル
の外側で行われた変更が反映されます。
SENSITIVE は、センシティブ・カーソルに対してのみ指定できます。 インセンシティブ・カーソルの場合は、エラーが発生し、FETCH ステートメントの効果はありません。 SENSITIVE カーソルの場合、SENSITIVE はデフォルトなので、それを指定することは任意です。
カーソルが SENSITIVE STATIC として宣言されているときに FETCH SENSITIVE が要求されると、次の手順が行われます。
- Db2 取得しようとしている結果テーブルの行に対応するデータベースの行を取得します。
- 対応する行が削除されると、結果表に「削除ホール」が発生し、警告が出され、カーソルは「ホール」に位置変更され、データはフェッチされません。(Db2 は、データベース内の対応する行が削除されると、結果表の行に「削除ホール」のマークを付けます。)
- 対応する行が削除されていない場合には、その元となる SELECT ステートメントの述部が再評価されます。 行が述部を満たさなくなると、結果表に「更新ホール」が発生し、警告が出されます。カーソルは「ホール」に位置変更され、データはフェッチされません。(Db2 は、データベース内の対応する行を更新すると、その行が結果表に適格でなくなる場合に、結果表内の行に「更新ホール」のマークを付けます。)
- 対応する行が結果表の中で削除または更新ホールにならない場合、 カーソルは結果表の行の上に位置変更されて、データが取り出されます。
- WITH CONTINUE
- Db2 サブシステムが、LOBまたはXML結果列の切り捨てられた部分に、LOBまたはXML列全体を保持するのに十分な大きさではない出力変数を提供する最初のFETCH操作の後に続くFETCH CURRENT CONTINUE操作がアクセスできるように準備することを指定します。 WITH CONTINUE句が指定された場合、 Db2 サブシステムは、FETCH文がWITH CONTINUE句を含まない場合と異なる以下のアクションを実行します
- XML または LOB カラムを返す際に切り捨てが発生した場合、 Db2 サブシステムは切り捨ての位置を記憶し、残りのデータを破棄しません。
- XML または LOB 列を返す際に切り捨てが発生した場合、 Db2 サブシステムは、LOB または XML 列のすべてのデータを保持するために必要となるであろう総長を返します。 この値は、LOB ホスト変数構造体の先頭 4 バイト、あるいは、 SQLDA の SQLVAR 項目 (そのホスト変数に対する項目) にある SQLDATALEN ポインターが指す 4 バイト領域のいずれかにあります。 戻される内容は、使用するプログラミング方式によって異なります。 SQLDAの内容の詳細については、 SQL記述子領域(SQLDA )を参照してください。
- XML データを戻す場合、結果の列は、データが戻される前にデータベース内で完全にマテリアライズされます。
CURRENT CONTINUE 文節を指定すると、WITH CONTINUE 動作と見なされます。
- AFTER
- 結果表の最終行の後にカーソルを位置付けます。 値はホスト変数に割り当てられません。 実効センシティビティーが INSENSITIVE または SENSITIVE STATIC であるカーソルの場合は、結果表の行数が SQLCA の SQLERRD1 フィールドと SQLERRD2 フィールドに戻されます。
- 前
- 結果表の先頭行の前にカーソルを位置付けます。 値はホスト変数に割り当てられません。
- 段配置
- 行位置付けのフェッチ・オリエンテーション NEXT、PRIOR、CURRENT、および RELATIVE を指定したカーソルの位置付けは、
現行カーソル位置を基準にして行われます。 行位置付け FETCH ステートメントが正常に実行された後、カーソルは単一のデータ行に位置付けられます。 カーソルが行セットに対して使用可能にされている場合、位置付けは現在行セットの
現在行または先頭行を基準にして行われ、カーソルは単一行の行セットに位置付けられます。
- NEXT
- 現行カーソル位置を基準にして結果表の次の行 (1 つ以上) にカーソルを位置付け、ターゲットが指定されていればデータを戻します。 NO SCROLL として定義されたカーソルに対して明示的に指定できる行位置付けフェッチ操作は、NEXT のみです。 NEXT は、他のカーソル位置付けが指定されていないときのデフォルトです。 指定した行がホールになっている場合は警告が出され、その行のホスト変数にデータ値は割り当てられません。
表1は、異なるカーソル位置と、NEXTが使用された場合の結果を記載しています。
表 1. さまざまなカーソル位置で NEXT を使用したときの結果 カーソルの現在位置 FETCH NEXT の結果 一番目行の前 カーソルが最初の行に位置し、リクエストされたデータが返されます。 最終行上、または最終行の後 警告が出され、値はホスト変数に割り当てられず、カーソル位置は変わりません。 ホールの前 SENSITIVE STATIC カーソルの場合は、削除ホールや更新ホールに対して警告が出され、値はホスト変数に割り当てられずに、カーソルがこのホールに位置付けられます。 不明 エラーが起こり、値はホスト変数に割り当てられず、カーソルの 位置は不明のままになります。 注:- この行は、前方スクロール・カーソルの場合 (つまり、NO SCROLL が暗黙的または明示的に指定されたとき) には、適用されません。
- PRIOR
- 現行カーソル位置を基準にして結果表の前の行 (1 つ以上) にカーソルを位置付け、ターゲットが指定されていればデータを戻します。 指定した行がホールになっている場合は警告が出され、その行のホスト変数にデータ値は割り当てられません。
表2は、PRIORが使用された場合の異なるカーソル位置と結果の状況をリストアップしています。
表 2. さまざまなカーソル位置で PRIOR を使用したときの結果 カーソルの現在位置 FETCH PRIOR の結果 先頭行の前または先頭行上 警告が出され、値はホスト変数に割り当てられず、カーソル位置は変わりません。 ホールの後 SENSITIVE STATIC カーソルの場合は、削除ホールや更新ホールに対して警告が出され、値はホスト変数に割り当てられずに、カーソルがこのホールに位置付けられます。 最後の行の次 カーソルは最終行に位置付けられます。 不明 エラーが起こり、値はホスト変数に割り当てられず、カーソルの 位置は不明のままになります。 - FIRST
- カーソルを結果表の先頭行に位置付け、ターゲットが指定されていればデータを戻します。 SENSITIVE STATIC カーソルの場合、結果表の最初の行がホールであれば、削除ホールまたは更新ホールに対して警告が出され、ホスト変数に値は割り当てられません。
- LAST
- カーソルを結果表の最終行に位置付け、ターゲットが指定されていればデータを戻します。 インセンシティブ・カーソルまたはセンシティブ静的カーソルの場合、結果表の行数が SQLCA の SQLERRD1 および SQLERRD2 フィールドに戻されます。 SENSITIVE STATIC カーソルの場合、結果表の最後の行がホールであると、削除ホールまたは更新ホールに対して警告が出され、値はホスト変数に割り当てられません。
- CURRENT
- カーソル位置は変更されず、ターゲットが指定されていればデータが戻されます。 カーソルが複数行からなる行セットに置かれていた場合、カーソル位置は行セットの先頭行に
なります。
表3は、CURRENT節でエラーが発生する状況を列挙しています。
表 3. CURRENT でエラーが起こる状態 カーソルの現在位置 FETCH CURRENT の結果 先頭行より前または最終行より後 警告が出され、値はホスト変数に割り当てられず、カーソル位置は変わりません。 ホール上 SENSITIVE STATIC の場合は、削除ホールや更新ホールに対して警告が出され、値はホスト変数に割り当てられずに、カーソルがこのホールに位置付けられます。 カーソルが、rowset カーソルとして定義、分離レベル UR で定義、またはセンシティブ動的両方向スクロール・カーソルとして定義されている場合は、最新のカーソル位置を設定した FETCH とは異なる行が戻される可能性があります。 これは、行を再度取り出す際に、その行が存在しなくなったと判断されるときに発生することがあります。 その場合は、行データを取得するために、フェッチが順方向に継続されます。
不明 エラーが起こり、値はホスト変数に割り当てられず、カーソルの 位置は不明のままになります。 - CONTINUE
- カーソルの位置付けは変更されず、ターゲットが指定されていればデータが戻されます。 FETCH CURRENT CONTINUE ステートメントは、前の FETCH ステートメントまたは FETCH CURRENT CONTINUE ステートメントで切り捨てられたすべての LOB 列または XML 列の結果値ごとに、残ったデータを取り出します。 このステートメントは、これら切り捨てられた列ごとに
残ったデータを、ステートメント内で参照されるホスト変数あるいは、記述子によって指示されるホスト変数に割り当てます。 以前に切り捨てられた結果値として戻されるデータは、切り捨て位置から始まります。 この形式の CURRENT 文節は、1 つ以上の LOB 列
または XML 列ごとに不完全なデータを戻した、単一行 FETCH WITH CONTINUE ステートメントあるいは FETCH CURRENT
CONTINUE ステートメントの後でしか使用してはいけません。 カーソルがオープン状態で、ある行上に位置している必要があります。
FETCH CURRENT CONTINUE は、非 LOB 列や非 XML 列がデータを何も戻さない場合であっても、SELECT リスト内のすべての列に対してホスト変数項目を渡す必要があります。
- ABSOLUTE
- ホスト変数 または 整数定数 は、整数値 K に割り当てられます。 ホスト変数 を指定する場合は、ゼロ・スケールの正確な数値タイプでなければならず、標識変数を含めることはできません。 ホスト変数に使用できるデータ・タイプは DECIMAL (n、0) または整数。 DECIMAL データ・タイプ
は DECIMAL(18,0) に限定されています。 integer-constant は、アプリケーション言語に応じて、最大 31 桁までにすることができます。
k=0 の場合、カーソルは結果表の先頭行の前に位置付けられます。 そうでなければ、ABSOLUTEは、 k>0 の場合には結果テーブルのk行目にカーソルを配置し、 k<0 の場合にはテーブルの下から k行目にカーソルを配置します。 例えば「ABSOLUTE -1」は、「LAST」と同じです。
指定した位置が結果表の行に含まれ、ターゲットが指定されている場合は、データが戻されます。
結果表の先頭行より前、または最終行より後に絶対位置が指定されると、警告が出され、ホスト変数に値が割り当てられず、カーソルは先頭行よりも前、または最終行よりも後に位置付けられます。 INSENSITIVE および SENSITIVE STATIC の両方向スクロール・カーソルの場合は、結果のカーソル位置が最終行より後であれば、結果表の行数が SQLCA の SQLERRD1 フィールドと SQLERRD2 フィールドに戻されます。 結果表の行 k がホールであると、警告が出され、値はホスト変数に割り当てられません。
FETCH ABSOLUTE 0 を指定した場合には、先頭行よりも前に位置付けられて、警告が出されます。 FETCH BEFORE を指定すると、先頭行よりも前に位置付けられて、警告は出されません。
表4は、いくつかの同義の仕様を列挙しています。
表 4. 同義語スクロール仕様 ABSOLUTE 仕様 代替 ABSOLUTE 0 (ただし警告付き) BEFORE (警告なし) ABSOLUTE +1 FIRST ABSOLUTE -1 LAST ABSOLUTE -m, 0<m≤n 絶対 n +1- m ABSOLUTE n LAST ABSOLUTE -n FIRST ABSOLUTE x (警告付き) AFTER (警告なし) ABSOLUTE -x (警告付き) BEFORE (警告なし) 注:仮定 : 0<=m <= n× ここで、 n は結果テーブルの行数です。 - RELATIVE
- ホスト変数 または 整数定数 は、整数値 K に割り当てられます。 ホスト変数 を指定する場合は、ゼロ・スケールの正確な数値タイプでなければならず、標識変数を含めることはできません。 ホスト変数に使用できるデータ・タイプは DECIMAL (n、0) または整数。 DECIMAL データ・タイプ
は DECIMAL(18,0) に限定されています。
カーソルが結果表の先頭行の前、あるいは最終行の後にある場合、カーソル位置は次のように決定されます。
- n が 0 の場合、カーソル位置は変化せず、値はホスト変数に割り当てられず、警告が出されます。
- n が正で、カーソルが先頭行の前にある場合、カーソルは行 n から始まる行セットに位置付けされます。
- n が正で、カーソルが最終行の後にある場合は、警告が出されます。
- n が負で、カーソルが先頭行の前にある場合は、警告が出されます。
- n が負で、カーソルが最終行の後にある場合、カーソルは結果表の最後から n 行目で始まる行セットに位置付けされます。
integer-constant は、アプリケーション言語に応じて、最大 31 桁までにすることができます。
指定した位置が結果表の行に含まれ、ターゲットが指定されている場合は、データが戻されます。
RELATIVEは、 k>0 の場合、現在の行からk行後の行に、 k<0 の場合、現在の行から ABS(k)行前の行にカーソルを配置します。 例えば 、「RELATIVE -1」は「PRIOR」と同じです。 k=0 の場合、 カーソルの位置は変わりません (これは「RELATIVE 0」が「CURRENT」と同じだからです)。
相対位置の指定、つまり、先頭行より前または最終行より後に結果が位置付けられると、 警告が出され、ホスト変数に値は割り当てられず、カーソルは先頭行より前か、 最終行の後に位置付けられます。 INSENSITIVE および SENSITIVE STATIC の両方向スクロール・カーソルの場合は、結果のカーソル位置 が最終行より後であれば、結果表の行数が SQLCA の SQLERRD1 フィールドと SQLERRD2 フィールドに戻されます。 カーソルがホールに位置付けられており、RELATIVE 0 が指定されている場合、または ターゲット行がホールである場合は、警告が出され、値がホスト変数に割り当てられません。
カーソルが、rowset カーソルとして定義、分離レベル UR で定義、またはセンシティブ動的両方向スクロール・カーソルとして定義されている場合は、最新のカーソル位置を設定した FETCH とは異なる行が戻される可能性があります。 これは、行を再度取り出す際に、その行が存在しなくなったと判断されるときに発生することがあります。 その場合は、行データを取得するために、フェッチが順方向に継続されます。
カーソルの位置が不明で、RELATIVE 0 が指定されているという場合は、エラーになります。
表5は、いくつかの同義の仕様を列挙しています。
表 5. 同義語スクロール仕様書 RELATIVE 仕様 代替 RELATIVE +1 NEXT RELATIVE -1 PRIOR RELATIVE 0 CURRENT RELATIVE +r (警告付き) AFTER (警告なし) RELATIVE -r (警告付き) BEFORE (警告なし) 注 :r は、カーソルを結果テーブルのどちらかの端を越えて配置できるほど十分に大きな値でなければなりません。
- 行セット位置
行セットでフェッチ方向が設定されたカーソルの位置付けは、現在のカーソル位置との関係で、NEXT ROWSET、PRIOR ROWSET、CURRENT ROWSET、および ROWSET STARTING AT RELATIVE で行われます。 rowset-positioned FETCH ステートメントが正常に実行された後、カーソルはデータの行セットに位置付けられます。 行セットの行数は、明示的または暗黙的に決定されます。 行セットのサイズを明示的に指定するには、multiple-row-fetch 文節内で FOR n ROWS 文節を使用します。 位置付けは、現在行または現在行セットの先頭行を基準にして行われ、カーソルは行セットのすべての行に位置付けられます。
行セットにアクセスするための現行カーソル位置が定義されていない場合は、行セット位置付けフェッチ・オリエンテーションを指定してはなりません。 NO SCROLL として定義されたカーソルに対して指定できる行セット位置付けフェッチ・オリエンテーションは、NEXT ROWSET のみです。
行セットの行がホールを反映している場合、警告が戻され、その行のホスト変数配列にデータ値は割り当てられません (つまり、ターゲット・ホスト変数配列内の対応する位置は変更されません)。その行に提供されているすべての標識変数に -3 が戻されます。 ホールが検出された場合に、標識変数が少なくとも 1 つ指定されていなければ、エラーが起こります。
- NEXT ROWSET
- 現行カーソル位置を基準にして結果表の次の行セットにカーソルを位置付け、ターゲットが指定されていればデータを戻します。 次の行セットを論理的に取得するために、現在行セットの後ろにある行が取り出され、さらに FOR n ROWS 文節に暗黙的または明示的に指定される数の行が取得されるか、または結果表の最終行に達するまで、追加の行が取り出されます。
カーソルが結果表の先頭行の前にある場合、カーソルは最初の行セットに位置付けられます。
カーソルが結果表の最終行または最終行の後にある場合、カーソル位置は変更されず、値はホスト変数配列に割り当てられず、警告が出されます。
行セットの行がホールになっている場合は、次のアクションが行われます。
- 警告が戻されます。
- その行のホスト変数配列にデータ値は割り当てられません (つまり、ターゲットのホスト変数配列の中で対応する位置は影響を受けません)。
- その行に対して指定されているすべての標識変数に値 -3 が戻されます。
ホールが検出された場合に、標識変数が少なくとも 1 つ指定されていなければ、エラーが戻されます。
前のエラーが原因でカーソルが位置付けられなかった場合、ホスト変数配列に値は割り当てられず、エラーが戻されます。 行セットの行が結果表の最終行より後になる場合は、その行と、以降の要求された行セットの行に対するホスト変数配列に値は割り当てられず、警告が戻されます。
NO SCROLL として定義されたカーソルに対して明示的に指定できる行セット位置付けフェッチ・オリエンテーションは、NEXT ROWSET のみです。
- PRIOR ROWSET
- 現在位置を基準にして結果表の前の行セットにカーソルを位置付け、ターゲットが指定されていればデータを戻します。
前の行セットを論理的に取得するために、現在の行セットの前にある行が取り出され、さらに FOR n ROWS 文節に暗黙または明示的に指定された数の行が取得されるか、または結果表の最終行に達するまで、追加の行が取り出されます。
カーソルが結果表の最終行の後にある場合、カーソルは最後の行セットに位置付けられます。
カーソルが結果表の最初の行または最初の行の前にある場合、カーソル位置は変更されず、値はホスト変数配列に割り当てられず、警告が出されます。
行が結果表の先頭行より前になる場合は、結果表の先頭行から始まり、カーソルの現在位置より前にある行のみで構成される部分行セットにカーソルが位置付けられ、警告が戻されます。 警告が戻された対象の行セットにある行のホスト変数配列には、値は割り当てられません。
行セットは、論理的には現在行セットの前から逆方向にフェッチすることによって取得されますが、アプリケーションに戻されるデータは、行セットの先頭行から始まり、行セットの最後に至るデータです。
行セットの行がホールになっている場合は、次のアクションが行われます。
- 警告が戻されます。
- その行のホスト変数配列にデータ値は割り当てられません (つまり、ターゲットのホスト変数配列の中で対応する位置は影響を受けません)。
- その行に対して指定されているすべての標識変数に値 -3 が戻されます。
ホールが検出された場合に、標識変数が少なくとも 1 つ指定されていなければ、エラーが戻されます。
前のエラーが原因でカーソルが位置付けられなかった場合、ホスト変数配列に値は割り当てられず、エラーが戻されます。
- FIRST ROWSET
- カーソルを結果表の先頭行セットに位置付け、ターゲットが指定されていればデータを戻します。
行セットの行がホールになっている場合は、次のアクションが行われます。
- 警告が戻されます。
- その行のホスト変数配列にデータ値は割り当てられません (つまり、ターゲットのホスト変数配列の中で対応する位置は影響を受けません)。
- その行に対して指定されているすべての標識変数に値 -3 が戻されます。
ホールが検出された場合に、標識変数が少なくとも 1 つ指定されていなければ、エラーが戻されます。
結果表の行数が、FOR n ROWS 文節に暗黙的または明示的に指定された行数より少ない場合、結果表の最終行より後のホスト変数配列に値は割り当てられず、警告が戻されます。
- LAST ROWSET
- カーソルを結果表の最終行セットに位置付け、ターゲットが指定されていればデータを戻します。 最後の行セットを論理的に取得するために、結果表の最終行が取り出され、さらに行セットの行数に達するか、結果表の先頭行に達するまで、前の行が取り出されます。 行セットは、論理的には結果表の末尾から逆方向にフェッチすることによって取得されますが、アプリケーションに戻されるデータは、行セットの先頭行から始まり、行セットの最後 (結果表の最後でもある) に至るデータです。
行セットの行がホールになっている場合は、次のアクションが行われます。
- 警告が戻されます。
- その行のホスト変数配列にデータ値は割り当てられません (つまり、ターゲットのホスト変数配列の中で対応する位置は影響を受けません)。
- その行に対して指定されているすべての標識変数に値 -3 が戻されます。
ホールが検出された場合に、標識変数が少なくとも 1 つ指定されていなければ、エラーが戻されます。
結果表の行数が、FOR n ROWS 文節に暗黙的または明示的に指定された行数より少ない場合、最終行セットは先頭行セットと同じであり、結果表の最終行より後のホスト変数配列に値は割り当てられず、警告が戻されます。
- CURRENT ROWSET
- FOR n ROWS 文節が指定している行数が、このカーソルに対する最新の FETCH ステートメントの FOR n ROWS 文節に暗黙的または明示的に指定された行数と異なる場合、カーソルの位置は、現在行セットの先頭行から始まる指定された数の行に変更されます。 カーソルが結果表の最初の行の前または最後の行の後にある場合、カーソル位置は変更されず、値はホスト変数配列に割り当てられず、警告が出されます。 FOR n ROWS 文節が指定されていない場合、FETCH CURRENT ROWSET ステートメントが処理されるときに、FETCH ステートメントによってカーソルが部分的な行セットに位置付けされる可能性があります。 この場合、 Db2 は現在の行セットの最初の行から始まる行セット全体にカーソルを配置しようとします。 そうでなければ、現在行セットのカーソルの位置は変更されません。 ターゲットが指定されている場合は、データが戻されます。
分離レベル UR、またはセンシティブ動的両方向スクロール・カーソルを使用している場合は、最新の rowset のカーソル位置を設定した FETCH とは異なる行が戻される可能性があります。 この現象は、行セットの先頭行を再度取り出す際に、その行が存在しなくなったと判断されると起こります。 この場合は、行セットの先頭のデータ行を取得するために、フェッチが順方向に継続されます。 現在行セットの他の行に対して行われた変更により、その行が存在しなくなったり、カーソルの結果表の中で (または外に) 論理的に移動されたりした場合にも、この現象が起こります。
前のエラーが原因でカーソルが位置付けられなかった場合、ホスト変数配列に値は割り当てられず、エラーが起こります。
現在行セットの行数が、FOR n ROWS 文節に暗黙的または明示的に指定された行数より少ない場合、最終行より後のホスト変数配列に値は割り当てられず、警告が戻されます。
- 絶対または相対のホスト変数 または 整数定数から始まる行セット
- ABSOLUTE または RELATIVE の指定によって示された結果表の行から始まる行セットにカーソルを位置付け、ターゲットが指定されていればデータを戻します。
ホスト変数 または 整数定数 は、整数値 Kに割り当てられます。 ホスト変数 を指定する場合は、スケールがゼロの正確な数値タイプでなければならず、標識変数を含めることはできません。 ホスト変数に指定できるデータ・タイプは、DECIMAL(n,0) または整数です。ただし、DECIMAL データ・タイプは DECIMAL(18,0) に制限されます。 定数を指定する場合、値は整数であることが必要です。
結果表の行が結果表の最終行より後、または先頭行より前になる場合は、その行に対するホスト変数配列に値は割り当てられず、警告が戻されます。
- ABSOLUTE
- k=0 の場合は、エラーが発生します。 k>0の場合、行セットの最初の行は行 k です。 k<0の場合、行セットは結果表の下部から ABS (k) 行に位置付けられます。 ABS(k) が行セットの行数に等しく、完全な行セットを戻すために十分な数の行があるとすると、次のように
なります。
- FETCH ROWSET STARTING AT ABSOLUTE -k はFETCH LAST ROWSETと同じです。
- FETCH ROWSET STARTING AT ABSOLUTE 1は、FETCH FIRST ROWSETと同じです。
- RELATIVE
- k=0 で、FOR n ROWS 文節がこのカーソルに対して暗黙的または明示的に指定された最新の数と異なる数を指定していなければ、カーソルの位置は変更されません (つまり、「RELATIVE ROWSET 0」は「CURRENT ROWSET」と同じ)。 k=0 で、FOR
n ROWS 文節がこのカーソルに対して暗黙的または明示的に指定された最新の数と異なる数を指定している場合、カーソルの位置は、現在行セットの先頭行から始まる指定された数の行に変更されます。
カーソルが結果表の先頭行の前、あるいは最終行の後にある場合、カーソル位置は次のように決定されます。
- n が 0 の場合、カーソル位置は変化せず、値はホスト変数に割り当てられず、警告が出されます。 これは FETCH CURRENT ROWSET の場合と同じです。
- n が正で、カーソルが先頭行の前にある場合、カーソルは行 n から始まる行セットに位置付けされます。
- n が正で、カーソルが最終行の後にある場合は、警告が出されます。
- n が負で、カーソルが先頭行の前にある場合は、警告が出されます。
- n が負で、カーソルが最終行の後にある場合、カーソルは結果表の最後から n 行目で始まる行セットに位置付けされます。
- FETCH ROWSET STARTING AT RELATIVE -k はFETCH PRIOR ROWSETと同じです。
- FETCH ROWSET STARTING AT RELATIVE kはFETCH NEXT ROWSETと同じです。
- FETCH ROWSET STARTING AT RELATIVE 0は、FETCH CURRENT ROWSETと同じです。
ROWSET STARTING AT RELATIVE -n が指定され、カーソルの現在位置と結果テーブルの最初の位置の間に、完全な行セットを返すのに十分な行がない場合:
- 警告が戻されます。
- 値はホスト変数配列に割り当てられません。
- カーソルは先頭行の前に位置付けられます。
行セットの行がホールになっている場合は、次のアクションが行われます。
- 警告が戻されます。
- その行のホスト変数配列にデータ値は割り当てられません (つまり、ターゲットのホスト変数配列の中で対応する位置は影響を受けません)。
- その行に対して指定されているすべての標識変数に値 -3 が戻されます。
ホールが検出された場合に、標識変数が少なくとも 1 つ指定されていなければ、エラーが戻されます。 行セットの行が不明の場合、その行のホスト変数配列に値は割り当てられず、エラーが戻されます。 行セットの行が結果表の最終行より後、または先頭行より前になる場合は、その行に対するホスト変数配列に値は割り当てられず、警告が戻されます。
- cursor-name
- フェッチ操作で使用するカーソルを指定します。 カーソル名は、DECLARE CURSOR文の説明で説明されているように、宣言されたカーソルを識別する必要があります。または、ALLOCATE CURSOR文の説明で説明されているように、割り当てられたカーソルを識別する必要があります。 FETCH ステートメントを実行する場合、カーソルはオープン状態
になければなりません。
single-row-fetch 文節または multiple-row-fetch 文節を指定しない場合、カーソル位置は指定のとおりに調整されますが、データはユーザーに戻されません。
- 単一列取得
- single-row-fetch を指定する場合は、デフォルトがあっても SENSITIVE または INSENSITIVE を指定できます。 デフォルトは、カーソルのセンシティビティーに依存します。 カーソルのセンシティビティーが INSENSITIVE ならば、デフォルトは INSENSITIVE です。 カーソルの実効センシティビティーが SENSITIVE DYNAMIC または SENSITIVE STATIC ならば、デフォルトは SENSITIVE です。 FETCH BEFORE オプションまたは FETCH AFTER オプションを指定する場合は、single-row-fetch 文節または multiple-row-fetch 文節を指定してはいけません。 FETCH BEFORE または FETCH AFTER を指定しない場合は、これらの文節が必要です。 個々のフェッチ操作によってカーソルが 1 つの行に位置付けられるか、または位置付けられた状態を保つ場合、ターゲットの指定があれば、結果表の値は single-fetch-clause の指定に従ってホスト変数に割り当てられます。
- INTO target-variable または array-variable[array-index]
- FL 500 出力値の割り当ての 1 つ以上のターゲットを識別します。 INTO 文節内のターゲットの数は、割り当てられる値の数と同じでなければなりません。 結果行の最初の値はリスト中の最初のターゲット、その次の値は 2 番目のターゲット、以下同様に割り当てられます。 INTO 文節内でターゲット変数を複数回指定してはなりません。 各ターゲットへの割り当ては、「割り当てと比較」 で説明されているルールに従って、リストの順番に実行されます。
結果列の値の数よりもターゲットの数の方が少ない場合には、SQLCA の SQLWARN3 フィールドに値「W」が割り当てられます。
いずれかの割り当てでエラーが発生すると、エラーが発生したターゲットに値は割り当てられず、それ以上、指定されたターゲットに値は割り当てられません。 既に割り当てられている値はすべて、割り当てられたままとなります。
グローバル変数名
FL 500 割り当て先となるグローバル変数を識別します。 グローバル変数は、SQL PL のコンテキストでのみ指定する必要があります。 グローバル変数が割り当てターゲットとして指定される場合、カーソルはスクロール不可でなければなりません。
- ホスト変数名
- 割り当てのターゲットとなるホスト変数を指定します。 LOB 出力値の場合、ターゲットとして可能なのは正規のホスト変数 (十分な大きさの場合)、LOB ロケーター変数、または LOB ファイル参照変数です。
- SQL-parameter-name
- 割り当てのターゲットとなるパラメーターを識別します。
- SQL-variable-name
- 割り当てターゲットである SQL 変数を識別します。 SQL 変数は、使用する前に宣言しておかなければなりません。
- 配列変数 [配列インデックス ]
- 代入のターゲットである配列エレメントを指定します。
- array-variable
- 配列変数を指定します。
- [array-index ]
- 配列のどのエレメントが割り当てのターゲットであるかを指定する式。
通常の配列の場合、添字式は INTEGER にキャスト可能でなければならず、NULL 値にすることはできません。 添字の値は、1 から、その配列に定義されている最大カーディナリティーまでの値でなければなりません。
連想配列の場合、配列添字の式は、その連想配列の添字のデータ・タイプにキャスト可能でなければならず、NULL 値であってはなりません。
array-index は、以下のものであってはなりません。
- CURRENT DATE、CURRENT TIME、または CURRENT TIMESTAMP 特殊レジスターを参照する式
- 非 deterministic 関数
- EXTERNAL ACTION を指定して定義された関数
- MODIFIES SQL DATA を指定して定義された関数
- シーケンス式
遷移変数名
遷移表で更新される列を指定します。 transition-variable-nameは、トリガのサブジェクトテーブルの列を識別しなければなりません。
- INTO DESCRIPTOR ディスクリプタ名
- SQLDA を指定します。これは、ホスト出力変数の有効な記述を含みます。 関連する SELECT ステートメントからの結果値は、
出力ホスト変数形式でアプリケーション・プログラムに戻されます。
FETCH ステートメントが処理される前に、SQLDA 内の次のフィールドを設定しておく必要があります。
- SQLDA に用意する SQLVAR のエレメント数を示す SQLN
REXX SQLDAには、このフィールドは含まれていません。
- SQLDA 内で割り振られるストレージのバイト数を示す SQLABC
- ステートメントの処理時にその SQLDA の使用される変数の数を示す SQLD
- 変数の属性を示す SQLVAR オカレンス
SQLDA には、すべての SQLVAR オカレンスが入るだけの十分なストレージがなければなりません。 各 SQLVAR オカレンスは、結果表内の値が割り当てられるホスト変数またはバッファーを記述します。 結果に LOB が存在する場合には、 その結果表の各列に追加の SQLVAR 項目があるはずです。 結果表に基本タイプと特殊タイプしか含まれていない場合、 各列には複数の SQLVAR 項目は必要ありません。 ただし、特別な SQLVAR 項目 が特殊タイプならびに DESCRIBE と PREPARE INTO ステートメントの LOB に必要です。 SQLDAの詳細については、SQLVARの説明とSQLVAR出現回数の決定方法に関する説明が含まれています。SQL記述領域(SQLDA) を参照してください。
SQLD に設定する値は、ゼロ以上で SQLN 以下でなければなりません。
C で記述子名を表す方法については、「C または C++ での SQLDA の識別」を参照してください。
- SQLDA に用意する SQLVAR のエレメント数を示す SQLN
- 複数行取得
- 照会の結果表から複数行のデータを取り出します。 FETCH ステートメントの FOR n ROWS 文節は、1 つの FETCH ステートメントに対して戻される行数を制御します。 フェッチ・オリエンテーションが、フェッチ結果のカーソル位置を決定します (例えば、単一行、行セット、結果表の前または後)。 フェッチは、エラーが戻されるか、要求した行がすべて取り出されるか、データ終了条件に達すると終了します。
複数行のデータのフェッチは、両方向スクロール・カーソルまたは順方向カーソルを使用して行うことができます。 複数行のデータのフェッチに使われるカーソルを定義、オープン、およびクローズするために使用する操作は、単一行 FETCH ステートメントの場合に使用する操作と同じです。
BEFORE オプションまたは AFTER オプションを指定する場合は、single-row-fetch または multiple-row-fetch のどちらも指定できません。
- FOR host-variable または integer-constant ROWS
- ホスト変数 または 整数定数 は、整数値 Kに割り当てられます。 ホスト変数を指定する場合には、そのホスト変数は位取りがゼロの正確な数値タイプでなければならず、標識変数を含んでいてはなりません。 さらに、K は 0<k<=32767の範囲内になければなりません。
row-positioned fetch-orientation 文節を指定した場合は、この文節を指定してはいけません。 また、行セット・アクセスを使用せずに定義されたカーソルに対しても、この文節を指定してはいけません。
行セットのフェッチ・オリエンテーションを指定した場合にこの文節を指定しなければ、結果の行セットの行数は次のように決定されます。
- このカーソルに対する最新の FETCH ステートメントが行セット位置付け FETCH ならば、行セットの行数は、このカーソルに対して最新に指定された (暗黙的または明示的に) 行数によって決定されます。
- このカーソルに対する最新の FETCH ステートメントが FETCH BEFORE または FETCH AFTER のどちらかであり、その前にこのカーソルに対して実行された最新の FETCH ステートメントが行セット位置付け FETCH ならば、行セットの行数は、このカーソルに対して最新に指定された (暗黙的または明示的に) 行数によって暗黙的に決定されます。
- それ以外の場合、行セットは単一行になります。
結果セット・カーソルの場合、行セットを定義したプロシージャー内で設定された rowset カーソル位置の行数は、行セットが戻されるときに呼び出し元に継承されません。 カーソルの行数を設定するには、呼び出し側プログラム内で結果セットに対する最初の行セット FETCH ステートメントに、FOR n ROWS 文節を使用してください。 それ以外の場合、行セットは単一行になります。
カーソルは、オリエンテーション文節 (例: NEXT ROWSET) に指定された行または行セットに位置付けられ、ターゲットが指定されている場合はこれらの行が取り出されます。 最初に取り出される行にカーソルが位置付けられた後、次の k-1 行が取り出されます。 フェッチは結果表のカーソル位置から順方向に進み、データ終了条件が戻されるか、k-1 行が取り出されるか、割り当てエラーが戻されるまで、フェッチが続行されます。
フェッチ結果のカーソル位置は、指定したフェッチ・オリエンテーションによって次のように異なります。
- 行位置付けフェッチ・オリエンテーションの場合、カーソルは最後に正常に取り出された行に位置付けられます。
- 行セット位置付けフェッチ・オリエンテーションの場合、カーソルは取り出された行すべてに位置付けられます。
個々のフェッチから得られた値は、INTO 文節または USING 文節に記述されたデータ域に置かれます。 行セット位置付け FETCH に対してターゲット仕様が提供されている場合は、ホスト変数配列をターゲット仕様として指定し、配列を 1 以上の次元で定義する必要があります。 暗黙的または明示的に指定された行数が 1 であっても、行セット位置付け FETCH に対しては、ターゲットの指定を配列として定義する必要があります。 FETCHステートメントで位置付けられた行セットの診断情報をご覧ください。
- ホスト変数配列にINTO
- 結果表のそれぞれの列ごとに、この FETCH ステートメントによって取り出されたデータを受け取るホスト変数配列を指定します。 ホスト変数配列の数が結果表の列数より少ない場合、SQLCA の SQLWARN3 フィールドは「W」に設定されます。 結果表の列数より多いホスト変数配列がある場合、警告は出されません。
それぞれのホスト変数配列は、配列の宣言に関する規則に準拠して、アプリケーション・プログラム内で定義されている必要があります。 ホスト変数配列は、結果表の列の値を戻すために使用されます。 フェッチされる行数は、それぞれのホスト変数配列の次元以下であることが必要です。
ホスト変数配列に対しては、オプションの標識配列を指定できます。 SQLVAR オカレンスの SQLTYPE により、結果表の列の NULL 可能であることが示されている場合には、この標識配列を指定する必要があります。 また、NULL 値が生じる可能性がある (UPDATE 操作によってホールが生じる場合など) 操作をアプリケーション内で実行する場合も、標識変数を指定する必要があります。 そうしなければ、NULL 値が検出されるとエラーが起こります。 標識は短精度整数として戻されます。
host-variable-array は C/C++、COBOL、および PL/I でサポートされます。 詳細については、 ホスト変数配列を参照のこと。
- INTO DESCRIPTOR ディスクリプタ名
- 結果表の列の値が戻される先である、任意数のホスト変数配列またはバッファーの有効な記述を格納する SQLDA を指定します。
FETCH ステートメントが処理される前に、SQLDA 内の次のフィールドを設定しておく必要があります。
- SQLDA に用意する SQLVAR のエレメント数を示す SQLN
- SQLDA に割り振るストレージのバイト数を示す SQLABC
- ステートメントの処理時にその SQLDA の使用される変数の数を示す SQLD
- ホスト変数配列のエレメントの属性を示す SQLVAR オカレンス。 配列を表すそれぞれの SQLVAR の内容は、次のとおりです。
- SQLTYPE は、ホスト変数配列のエレメントのデータ・タイプを示します。
- SQLDATA フィールドは、ホスト変数配列の最初のエレメントを指示します。
- 配列の単一エレメントの最大長を示す長さフィールド (SQLLEN と SQLLONGLEN) が設定されます。
- SQLNAME - SQLNAME の長さは 8 に設定する必要があり、SQLNAME のデータ部分の先頭 2 バイトは X'0000' に初期化する必要があります。 5 番目と 6 番目のバイトにはフラグ・フィールドを格納する必要があり、7 番目と 8 番目のバイトの初期化は、ホスト変数配列の次元の 2 進短精度整数 (ハーフワード) 表現、および対応する標識配列 (指定されていれば) にする必要があります。
SQLDATA と SQLIND のポインターは、対応する配列の先頭に設定します。 SQLDA には、すべての SQLVAR オカレンスが入るだけの十分なストレージがなければなりません。 各 SQLVAR オカレンスは、結果表の列の値が戻される先のホスト変数配列またはバッファーを記述します。 結果表のいずれかの列が LOB である場合は、それぞれの SQLVAR ごとに 2 つの SQLVAR 項目が必要で、SQLN は SQLVARS の数値の 2 倍に設定する必要があります。 SQLD に設定する値は、ゼロ以上で SQLN 以下でなければなりません。
注釈 FETCH
- ターゲットへの割り当て:
- INTO 文節に示される、または SQLDA 内で記述される n 番目のターゲットは、カーソルの結果表の n 列目に対応しています。 ターゲットのデータ・タイプは、その対応する値と互換でなければなりません。 値が数値の場合、ターゲットにはその値の整数部分を表すだけの容量がなければなりません。 datetime値の場合、ターゲットは、datetime値の文字列表現で定義されている最小の長さの文字列変数でなければなりません。 ターゲットがホスト変数の際に、値が NULL の場合は、標識変数を指定しなければなりません。
割り当ては、リストされている順に行われます。 ターゲットへの各割り当ては、「SQLにおける言語要素 」で説明されているルールに従って行われます。 ターゲットの数が行の中の値の数よりも少ない場合は、SQLCA の SQLWARN3 フィールドは W に設定されます。 ターゲットの数が結果列の数より多い場合、警告は出されません。 ターゲットがホスト変数で、値が NULL の場合には、標識変数を指定しなければなりません。 割り当てエラーが発生すると、値はターゲットに割り当てられず、値はそれ以上ターゲットに割り当てられません。 それまでに既にターゲットに割り当てられていた値はそのままになります。
同じ割り当てステートメントに割り当てが複数含まれる場合は、すべての expressions を評価してから割り当てが実行されます。 例えば、式内の変数への参照は、常時、割り当てステートメント内のどの割り当てよりも前の変数の値を使用します。
通常、LOB 列に対してデータの割り当てと取り出しを行うには、LOB ロケーターを使用します。 ただし、互換性規則により、LOB ロケーターを使用して他のデータ・タイプのターゲットにデータを割り当てることもできます。 ロケータの使用方法の詳細については、「LOB ロケータを使用した LOB の操作時のストレージ容量の節約 」を参照してください。
タイム・ゾーンなしのタイム・スタンプの値を、タイム・ゾーン付きのタイム・スタンプのターゲットに割り当てることはできません。
このデータのデフォルトのコード化スキームは、バインド・オプション ENCODING にある値です。このオプションは、アプリケーションのエンコードのためのものです。 このステートメントが LOB ロケーター上で稼働する関数 (LENGTH または SUBSTRING など) と共に使用されている場合で、 かつそのロケーターで指定された LOB データが ENCODING バインド・オプションとは異なるコード化スキームにある場合、 LOB マテリアライズと文字変換が起こります。 LOB マテリアライズと文字変換を防止するには 、SYSIBM.SYSDUMMYA、SYSIBM.SYSDUMMYE、または SYSIBM.SYSDUMMYU サンプル表か ら LOB データを選択します。
- WITH CONTINUE 文節および CURRENT CONTINUE 文節の使用に関する制約事項:
- WITH CONTINUE句を使用する場合、 Db2 システムは、出力ホスト変数のデータ型が適切なLOBデータ型である場合のみ、BLOB、CLOB、DBCLOB、またはXMLデータ型の結果セット列の切り捨てられたデータのみを予約します。
アプリケーションが FETCH WITH CONTINUE を使用し、切り捨てられたデータが FETCH 操作の後も残っている場合は、そのアプリケーションは、FETCH CURRENT CONTINUE を実行する前には、そのカーソルに対して何も介入操作を行えません。 そのカーソルに対して介入操作を行うと、切り捨てられたデータは失われます。
FETCH CURRENT CONTINUE は、複数行 FETCH ではサポートされません。 また、FETCH CURRENT CONTINUE は、切り捨てられた 非 LOB 列や非 XML 列に対してもサポートされません。 これらの非 LOB 列や非 XML 列に対して切り捨てが発生すると、 切り捨てられたデータは通常通り失われます。
- 結果列の評価に関する考慮事項:
- 外部の SELECT ステートメントの SELECT リストにある算術式の結果としてエラーが発生 (ゼロによる除算、またはオーバーフロー) した場合、または数値変換エラーが発生した場合には、その結果は NULL 値となります。 他の NULL 値の場合と同様に、標識変数を用意しなければなりません。メイン変数は変更されません。 しかし、この場合、標識変数が -2 に設定されます。 ステートメントの処理は、エラーが起こらなかったものとして続行されます。 (ただし、このエラーの場合は SQLCODE が正になります。) 標識変数を用意していない場合には、SQLCA の SQLCODE フィールドに負の値が戻されます。 エラーが検出されると、ステートメントの処理は終了します。 その時のホスト変数またはそれ以降の変数には、値は割り当てられません。ただし、既に変数に割り当てられている値は、割り当てられたままの状態となります。
指定したホスト変数に、結果を格納するために十分な大きさがない場合は、警告が戻され、SQLCA 内の SQLWARN1 に W が割り当てられます。 結果の実際の長さは、標識が指定されていれば、ホスト変数に関連した標識変数に戻されます。 FETCH 操作に関する警告が戻されない可能性があります。 このことは、システム一時表の使用やブロッキングなど、最適化が行われると起こります。 以前取り出された行に対する警告が戻されたりする場合があります。 日時値が戻された場合、値を完全に格納するために十分な長さの変数が必要です。 そうでなければ、警告またはエラーが戻されます。
- 処理のためにアクセラレーター・サーバーに渡された行セット・カーソルで FETCH ステートメントを使用する場合の考慮事項:
- Db2 アクセラレータサーバーに渡して処理する行セットクエリに限定したサポートを提供します。 Db2 高速化されたクエリデータへの高性能アクセスのみをサポートします。 データは行セットでプリフェッチされ、multiple-row-fetch ステートメントを使用して返されて、1 つの FETCH ステートメントの複数の行データが返されます。 次の制限が、アクセラレートされた行セット・カーソルに対して実行される FETCH ステートメントに適用されます。
- すべての FETCH 要求は、行セットのフェッチでなければなりません。
- すべての FETCH 要求は、FOR n ROWS 節を指定する必要があります。
- すべての FETCH 要求は、同じ行セット・サイズを指定しなければなりません。
- すべての FETCH 要求は、ターゲットのホスト変数を指定しなければなりません。 (FETCH 操作には、位置付けのためにターゲットが必要です。)
- カーソルの位置決め:
- オープン・カーソルの位置としては、以下の 3 通りがあります。
- 行の前
- 行または行セットに
- 最後の行の次
スクロール可能またはスクロール不可のカーソルがオープンされると、 それは結果表の先頭行の前に位置付けられます。 カーソル位置が行にある場合、その行はカーソルの現在行と呼ばれます。 カーソルが行セットにある場合、その行の集まりはカーソルの現在行セットと呼びます。
UPDATE ステートメントまたは DELETE ステートメント内で参照される カーソルは、行または行セットに位置付けられていなければなりません。 カーソルは、FETCH ステートメントを実行して初めて、行または行セットに置かれます。
カーソルが SENSITIVE STATIC SCROLL と宣言されている場合は、行がホール になる可能性があり、その行の値をフェッチ、更新、または削除することはできません。 センシティブな動的カーソルの場合は、一時結果表がないので、ホールは存在しません。 詳細は、「スクロール可能なカーソルを使用した結果テーブルの穴 」を参照してください。
両方向スクロール・カーソルの場合、エラーの後のカーソルの位置は、エラーのタイプに応じて変化します。
- 更新または削除ホールに対して操作が行われたり、更新または削除ホールが検出さ れると、カーソルはそのホールの上に位置付けられます。
- FETCH 操作がファイルの終わりを過ぎて実行されると、カーソルは最後の行の後に 位置付けられます。
- FETCH 操作がファイルの先頭よりも前に実行されると、カーソルは最初の 行の前に位置付けられます。
- エラーによりカーソル位置が無効になった場合 (例えば、単一行の位置付け UPDATE や位置付け DELETE のエラーが発生し、そのためにロールバックが発生した場合)、カーソルがクローズされます。
- 例外条件後のカーソルの位置:
- フェッチ操作の実行中にエラーが発生した場合、カーソルの位置と、その後のフェッチの結果は予測できません。 カーソルの位置が無効となるようなエラーが起こる可能性もあります。この場合、カーソルはクローズされます。
個々のフェッチ操作がカーソル範囲外の宛先を指定すると、 警告が出され (FETCH BEFORE または FETCH AFTER を除く)、 カーソルは結果表の前または後に位置付けられ、 そして値はホスト変数に割り当てられません。
- 並行性とスクロール可能性:
- カーソルの現在行は、それがロックされている場合、別のアプリケーション・プロセスによって更新または削除できません。 以下の事柄があてはまる場合は、現在の作業単位の間にアプリケーション・プロセスによる
挿入または更新操作を受けたという理由で既にロックされているのでないかぎり、
カーソルの現在行はロックされていません。
- 分離レベルが UR である。または
- 分離レベルが CS である。
- カーソルの結果表が読み取り専用である。
- バインド・オプション CURRENTDATA(NO) が有効である。
動的両方向スクロール・カーソルは、更新された行と新しく挿入された行の認識がアプリケーションにとって重要で、削除された行を認識する必要がない場合に便利です。 動的両方向スクロール・カーソルの並行性を最大限にするには、分離レベル CS を使用する必要があります。 分離レベル RR または RS を指定すると、表の更新が大幅に制限されるので、SENSITIVE DYNAMIC 両方向スクロール・カーソルの目的が果たされません。 アプリケーションが定数の結果表を必要としている場合は、分離レベル CS の SENSITIVE STATIC 両方向スクロール・カーソルを使用する必要があります。
- データベースの変更に対する SENSITIVE STATIC SCROLL カーソルのセンシティビティー:
- SENSITIVE STATIC SCROLL が宣言されていると、以下の規則が適用されます。
- 「オープン」後に、カーソル内で更新操作の結果を可視にするには、その更新操作がカーソルに対して実行された位置付け UPDATE であるか、または他の手段 (つまり、検索 UPDATE、コミッ トされた他の更新、または同じプロセス内で別のカーソルを使った更新) を使って更新された行に 対して、STATIC カーソルの FETCH SENSITIVE を実行する必要があります。
- 別のプロセスを行って、現在の値が WHERE 文節を満たさなくなるよう
に SELECT ステートメントの基本表を更新することができます。 この場合、基本表内の値が WHERE 文節を満たさない間は、「更新ホール」が事実上存在し、その行にはカーソルを介してアクセスできなくなります。 更新ホールとして指定されている行をフェッチしようとすると、値は戻されず、警告が出されます。
SENSITIVE STATIC SCROLL カーソルの下では、更新ホールは 位置付け UPDATE、位置付け DELETE、および FETCH SENSITIVE 操作の間しか 識別されません。 位置付け UPDATE、位置付け DELETE、および FETCH SENSITIVE 操作は それぞれ、更新ホールが存在するかどうかを判別するために必要なテストを実行します。
- SENSITIVE STATIC SCROLL カーソル内で削除操作の結果が見えるようにするには、 その削除操作は、そのカーソルに対して実行された位置付け DELETE であるか、 または STATIC カーソル内の FETCH SENSITIVE が他の何らかの手段 (検索削除、他のもののコミット削除、 または同一プロセス内の別のカーソルを使った削除) を使って削除された行に 対して実行されなければなりません。
- 別のプロセス、または同じプロセスを行って、カーソルの行が基本表内の
対応する行を持たなくなるように、SELECT ステートメントの基本表の中の行を
削除することができます。 この場合は、「削除ホール」が事実上存在し、その行にはカーソルを使ってアクセスできなくなります。 削除ホールとして指定されている行をフェッチしようとすると、値は戻されず、警告が出されます。
SENSITIVE STATIC SCROLL カーソルの下では、削除ホールは位置付け UPDATE、位置付け DELETE、および FETCH SENSITIVE 操作中に識別されます。
- SENSITIVE STATIC SCROLL カーソルの基本表 (複数も可) への挿入は、 カーソルがオープンされた後は見られません。
- LOB ロケーター:
- 情報が LOB ロケーターに取り入れられ、しかも複数の FETCH ステートメントでそのロケーターを保存する必要がない場合には、ロケーター・リソースが制限されるため、別の FETCH ステートメントを出す前に FREE LOCATOR ステートメントを出すのがよいやり方です。
- 分離レベルに関する考慮事項:
- ステートメントの分離レベル (暗黙的または明示的に指定された) は、行セット位置付け FETCH ステートメントの結果に影響する可能性があります。 このことが起こりうるのは、動的両方向スクロール・カーソルに対して分離レベル UR が使用されているときに、カーソルの基礎になる表に変更が加えられた場合や、その他の分離レベルではカーソルからフェッチ中のアプリケーションによって行が追加された場合です。 次に示すフェッチ・オリエンテーションで、このような状態が発生する可能性があります。
- PRIOR ROWSET
- 動的両方向スクロール・カーソルと分離レベル UR を使用している場合は、前の行セットの内容が、表内で行われる他のアクティビティーの影響を受ける可能性があります。 以前はカーソルに対して適格であり、「前の」行セットにメンバーとして含まれていた行が、その後で実際に行セットの一部として現行ステートメントに戻される前に削除または変更されることが考えられます。 このような動作が起こらないようにするには、UR 以外の分離レベルを使用します。
- CURRENT ROWSET
- 動的両方向スクロール・カーソルの場合、ユーザーに戻された行セットを構成する行の間に行が追加される可能性があります。 分離レベル RR の場合は、カーソルからフェッチ中のアプリケーションだけがこれらの行を追加できます。 RR 以外の分離レベルの場合は、後続の FETCH CURRENT ROWSET の結果に影響する行が、他のアプリケーションによって挿入される可能性があります。 この動作が起こらないようにするには、動的両方向スクロール・カーソルの代わりに静的両方向スクロール・カーソルを使用します。
- LAST ROWSET
- 動的両方向スクロール・カーソルと分離レベル UR を使用している場合は、最後の行セットの内容が、表内で行われる他のアクティビティーの影響を受ける可能性があります。 以前はカーソルに対して適格であり、「最後の」行セットにメンバーとして含まれていた行が、その後で実際に行セットの一部として現行ステートメントに戻される前に削除または変更されることが考えられます。 このような動作が起こらないようにするには、UR 以外の分離レベルを使用します。
- 相対 -n から始まる行セット (-n は負の数)
- 動的両方向スクロール・カーソルと分離レベル UR を使用している場合は、前の行セットの内容が、表内で行われる他のアクティビティーの影響を受ける可能性があります。 以前はカーソルに対して適格であり、「前の」行セットにメンバーとして含まれていた行が、その後で実際に行セットの一部として現行ステートメントに戻される前に削除または変更されることが考えられます。 このような動作が起こらないようにするには、UR 以外の分離レベルを使用します。
- 行位置付けおよび行セット位置付けの FETCH ステートメントの相互作用:
- 次の表は、行位置付けと行セット位置付けの FETCH ステートメントの相互作用を例示しています。 この表は、次の前提事項に基づいています。
- TABLE T1 には 15 の行があります。
- CURSOR CS1 は次のように宣言されています。
DECLARE CS1 SCROLL CURSOR WITH ROWSET POSITIONING FOR SELECT * FROM T1; - CURSOR CS1 に対して OPEN CURSOR ステートメントが正常に実行され、表の FETCH ステートメントは表に示されている順序で実行されます。
表 6. 行位置付けと行セット位置付けの FETCH ステートメントの相互作用 FETCH ステートメント カーソル位置 FETCH FIRST カーソルは、行 1 に位置付けられる。 FETCH FIRST ROWSET カーソルは、行 1 からなるサイズ 1 の行セットに位置付けられる。 FETCH FIRST ROWSET FOR 5 ROWS カーソルは、行 1、2、3、4、および 5 からなるサイズ 5 の行セットに位置付けられる。 FETCH CURRENT ROWSET カーソルは、行 1、2、3、4、および 5 からなるサイズ 5 の行セットに位置付けられる。 FETCH CURRENT カーソルは、行 1 に位置付けられる。 FETCH FIRST ROWSET FOR 5 ROWS カーソルは、行 1、2、3、4、および 5 からなるサイズ 5 の行セットに位置付けられる。 FETCH または FETCH NEXT カーソルは、行 2 に位置付けられる。 FETCH NEXT ROWSET カーソルは、行 3 からなるサイズ 1 の行セットに位置付けられる。 FETCH NEXT ROWSET FOR 3 ROWS カーソルは、行 4、5、および 6 からなるサイズ 3 の行セットに位置付けられる。 FETCH NEXT ROWSET カーソルは、行 7、8、および 9 からなるサイズ 3 の行セットに位置付けられる。 FETCH LAST カーソルは、行 15 に位置付けられる。 FETCH LAST ROWSET FOR 2 ROWS カーソルは、行 14 と 15 からなるサイズ 2 の行セットに位置付けられる。 FETCH PRIOR ROWSET カーソルは、行 12 と 13 からなるサイズ 2 の行セットに位置付けられる。 FETCH ABSOLUTE 2 カーソルは、行 2 に位置付けられる。 絶対値2から始まる3つの行の行セットを取得 カーソルは、行 2、3、および 4 からなるサイズ 3 の行セットに位置付けられる。 FETCH RELATIVE 2 カーソルは、行 4 に位置付けられる。 絶対値2から始まる4つの行の行セットを取得 カーソルは、行 2、3、4、および 5 からなるサイズ 4 の行セットに位置付けられる。 FETCH RELATIVE -1 カーソルは、行 1 に位置付けられる。 絶対値3から始まる2行の行セットを取得 カーソルは、行 3 と 4 からなるサイズ 2 の行セットに位置付けられる。 相対4から始まる行セットを取得 カーソルは、行 7 と 8 からなるサイズ 2 の行セットに位置付けられる。 FETCH PRIOR カーソルは、行 6 に位置付けられる。 絶対値13から5行の行セットを取得 カーソルは、行 13、14、および 15 からなるサイズ 3 の行セットに位置付けられる。 FETCH FIRST ROWSET カーソルは、行 1、2、3、4、および 5 からなるサイズ 5 の行セットに位置付けられる。 注意 : EOFに遭遇したため、前のFETCH文は3行のみを返しましたが、 Db2 は前のFETCH文で5行が要求されたことを記憶しています。 - FOR n ROWS 文節を FETCH FIRST n ROWS ONLY 文節とともに使用する場合の考慮事項:
- カーソルの SELECT ステートメント、カーソルの FETCH ステートメント、または両方に、要求する行数を指定する文節を指定できます。 ただし、これらの文節の効果は次のように異なります。
- SELECT ステートメント内では、FETCH FIRST n ROWS ONLY 文節は、カーソルによってアクセスできる最大行数を制御します。 FETCH ステートメントが、SELECT ステートメントの FETCH FIRST n ROWS ONLY 文節に指定された数を超える行を取り出そうとすると、データ終了条件が発生します。
- FETCH ステートメント内では、FOR n ROWS 文節は 1 つの FETCH ステートメントに対して戻される行数を制御します。
これらの文節は両方とも指定できます。
更新されるカラムを参照する:
カーソルが後で更新される列を取得するためにFETCH文を使用する場合、列を選択する時にFOR UPDATE OFを指定します。 次に、その後の UPDATE または DELETE 文で WHERE CURRENT OF を指定します。 これらの条項により、 Db2 が更新中の列のインデックス経由のアクセスを選択することができなくなり、そうでないと Db2 が同じ行を複数回読み込む可能性がある。詳細は、「以前に取得したデータの更新 」を参照してください。

- 行セット位置付け FETCH ステートメントの診断情報:
- rowset カーソルからフェッチを行う単一の FETCH ステートメントが、ゼロ、1 つ、または複数の条件を検出することがあります。 現行カーソル位置がフェッチ・オリエンテーションに無効な場合は、警告が出されて、ステートメントは終了します。 警告または終了しないエラー (バインドアウト・エラーなど) が行のフェッチ中に発生しても、処理は継続します。 この場合、FETCH ステートメントのサマリー・メッセージが戻され、フェッチされた各行についての追加情報を GET DIAGNOSTICS ステートメントで取得できます。 これらの FETCH ステートメントに対して検出された条件すべての情報を入手するには、GET DIAGNOSTICS ステートメントを使用します。 詳細は「診断を受ける」の項をご覧ください。SQLCA は、rowset カーソルからのフェッチ中に検出されたエラーと警告に関する情報を戻します。 データ終了が検出されるか、終了条件が発生すると、処理は停止します。 rowset カーソルからの FETCH ステートメントが終了するたびに、情報が SQLCA を介してプログラムに戻されます。 SQLCA は次のように設定されます。
- SQLCODE には SQLCODE が格納されます。
- SQLSTATE には SQLSTATE が格納されます。
- カーソルが結果表の最終行上に位置づけられている場合、 SQLERRD1 と SQLERRD2 には結果表の行数が格納されます。
- SQLERRD3 には、実際に戻された行数が格納されます。 SQLERRD3 が要求した行数より少ない場合は、エラーまたはデータ終了条件が発生しています。
- FETCH ステートメントの処理中に累積した警告すべてを示す SQLWARN フラグが設定されます。
次の例を考えてみましょう。この例では、1 つの FETCH ステートメントによって 10 行が取り出されます。
- 例 1
- 5th 行でエラーが検出されたとします。 SQLERRD3 は 4 行が戻されたことを示す 4 に設定され、SQLSTATE は
22537 に設定され、SQLCODE は -354 に設定されます。 この情報は、GET DIAGNOSTICS ステートメントによって入手することもできます (戻される情報は接続されたサーバーから生成され、サーバーによって情報が異なる可能性があります)。 以下に例を示します。
GET DIAGNOSTICS :num_rows = ROW_COUNT, :num_cond = NUMBER; -- Results of the statement: -- num_rows = 4 and num_cond = 1 (1 condition)GET DIAGNOSTICS CONDITION 1 :sqlstate = RETURNED_SQLSTATE, :sqlcode = DB2_RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 22537, sqlcode = -354, and row_num = 5 - 例 2
- 6th 行でデータ終了条件が検出され、カーソルが更新に対して即時センシティビティーを持っていないとします。 SQLERRD3 は 5 行が戻されたことを示す 5 に設定され、SQLSTATE は 02000 に設定され、SQLCODE は +100 に設定されます。 この情報は、GET DIAGNOSTICS ステートメントによって入手することもできます。 以下に例を示します。
GET DIAGNOSTICS :num_rows = ROW_COUNT, :num_cond = NUMBER; -- Results of the statement: -- num_rows = 5 and num_cond = 1 (1 condition)GET DIAGNOSTICS CONDITION 1 :sqlstate = RETURNED_SQLSTATE, :sqlcode = DB2_RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 02000, sqlcode = 100, and row_num = 6 - 例 3
- 5th 行でバインド・エラー条件が検出され、その条件が記録され、処理が続行されると想定します。 また、8 番目の行
でデータの終わり条件が検出されたと仮定します。 SQLERRD3 は 7 行が戻されたことを示す 7 に設定され、SQLSTATE は 02000 に設定され、SQLCODE は +100 に設定されます。 この FETCH ステートメントを完了する処理が行われ、発生したバインドアウト・
エラーが示されます。 追加の SQLCODE がバインドアウト・エラーに対して記録されます。 SQLCODE が -354 に設定され、
SQLSTATE が 01668 に設定されます。 GET DIAGNOSTICS ステートメントを使用して何
が続行したかを判別します。 以下に例を示します。
GET DIAGNOSTICS :num_rows = ROW_COUNT, :num_cond = NUMBER; -- Results of the statement: -- num_rows = 7 and num_cond = 3 (3 conditions)GET DIAGNOSTICS CONDITION 1 :sqlstate = RETURNED_SQLSTATE, :sqlcode = RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 01668, sqlcode = -354, and row_num = 0GET DIAGNOSTICS CONDITION 2 :sqlstate = RETURNED_SQLSTATE, :sqlcode = RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 02000, sqlcode = 100, and row_num = 0GET DIAGNOSTICS CONDITION 3 :sqlstate = RETURNED_SQLSTATE, :sqlcode = RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 22003, sqlcode = -302, and row_num = 5
場合によっては、 Db2 は、インジケーター変数が指定されている場合は警告を返し、インジケーター変数が指定されていない場合はエラーを返します。 これらのエラーは、標識変数が指定されている場合に警告を引き起こすデータ・マッピング・エラーと見なすことができます。
- Db2 は、指標変数が提供されている場合、そのエラーをマークし、すべての行をユーザーに返します。 SQLCODE と SQLSTATE には、最後のデータ・マッピング・エラーからの警告が格納されます。 GET DIAGNOSTICS ステートメントを使用して、発生したデータ・マッピング・エラーすべての情報を取り出すことができます。
- 一部またはすべての標識変数が提供されていない場合は、標識変数のない最初のデータ・マッピング・エラーが検出されるまで、すべての行が前述のように戻されます。 正常に取り出された行が戻され、SQLSTATE、SQLCODE、および SQLWARN の各フラグが必要に応じて設定されます。 (SQLCODE は 0 または正の値のいずれか)
データ・マッピング・エラーが発生した場合に、カーソルの位置付けは正常に行われる可能性があります。 この場合、カーソルはデータ・マッピング・エラーの生じた行セットに位置付けられます。
次の例を考えてみましょう。この例では、1 つの FETCH ステートメントによって 10 行のフェッチを試行します。
- 例 1
- 列 1 には戻された値について標識が提供されているが、列 2 については提供されていないと想定します。 5th 行の列 1 にデータ・マッピング・エラー (+ 802) があり、7th 行の列 2 にデータ・マッピング・エラーがあります (列 2 に標識が指定されていないため、-802 が戻されます)。 SQLERRD3 は 6 行が戻されたことを示す 6 に設定され、SQLSTATE と SQLCODE は 7 番目に取り出された行からのエラーに設定されます。 5 行目の列 1 の標識変数は、データ・マッピング・エラーが検出されたことを示します。 この情報は、GET DIAGNOSTICS ステートメントによって入手することもできます。例を次に示します。
GET DIAGNOSTICS :num_rows = ROW_COUNT, :num_cond = NUMBER; -- Results of the statement: -- num_rows = 6 and num_cond = 2 (2 conditions)GET DIAGNOSTICS CONDITION 1 :sqlstate = RETURNED_SQLSTATE, :sqlcode = DB2_RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 01519, sqlcode = +802, and row_num = 5
フェッチ結果のカーソル位置は不明です。GET DIAGNOSTICS CONDITION 2 :sqlstate = RETURNED_SQLSTATE, :sqlcode = DB2_RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 22003, sqlcode = -802, and row_num = 7 - 例 2
- NULL 標識が提供されており、行 3 と 5 がホールであり、要求された他の行のデータが存在するとします。 SQLERRD3 は、10 回のフェッチが完了したことと、要求した 10 行の情報が戻されたことを反映して 10 に設定されます。 実際には 8 つの行にデータがあります。 2 つの行に対しては、これらの行に対してデータが戻されなかったことを示す標識変数が設定されます。 SQLSTATE は 02502 に設定され、SQLCODE は +222 に設定され、行 3 と 5 の NULL 標識はすべて、ホールが検出されたことを示す -3 に設定されます。 この情報は、GET DIAGNOSTICS ステートメントによって入手することもできます。例を次に示します。
GET DIAGNOSTICS :num_rows = ROW_COUNT, :num_cond = NUMBER; -- Results of the statement: -- num_rows = 10 and num_cond = 2 (2 conditions)GET DIAGNOSTICS CONDITION 1 :sqlstate = RETURNED_SQLSTATE, :sqlcode = DB2_RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 02502, sqlcode = +222, and row_num = 3
ホールになっていた行の変数に対して NULL 標識が指定されていなかった場合は、エラーが発生します。GET DIAGNOSTICS CONDITION 2 :sqlstate = RETURNED_SQLSTATE, :sqlcode = DB2_RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER; -- Results of the statement: -- sqlstate = 02502, sqlcode = +222, and row_num = 5
- SQLCA の使用法の要約:
- 複数行フェッチの場合、SQLCA のフィールドは次のように設定されます。
条件 アクション: SQLCA フィールドに格納される結果値 エラー データ SQLSTATE SQLCODE SQLERRD3 ノー1 要求した行すべてが戻される 00000 0 要求された行数 ノー1 要求した行のサブセットのデータ、データ終了 02000 +100 行数 ノー1 要求した行すべてが戻される sqlstate(2) sqlcode(2) 要求された行数 はい 1 正常に取り出された行が戻される sqlstate(3) sqlcode(3) 行数 はい 1 正常に取り出された行が戻される sqlstate(4) sqlcode(4) 行数 注:- SQLWARN フラグは、他の警告やエラーが示されていなくても、あらゆるケースで設定される可能性があります。 警告フラグは、複数行フェッチの処理中に設定された警告フラグすべての累積です。
- sqlcode は最後に出された正の SQLCODE で、sqlstate は対応する SQLSTATE 値です。
- Database Server が検出したエラー。 sqlcode は最初に出された負の SQLCODE、sqlstate は対応する SQLSTATE 値です。
- クライアントが検出したエラー。 sqlcode は最初に出された負の SQLCODE、sqlstate は 22002、22008、22509、22518、または 55021 のいずれかの SQLSTATE です。
- エラー条件用の標識変数の提供:
- 外部の SELECT ステートメントの SELECT リストにある算術式の結果としてエラーが発生 (ゼロによる除算、またはオーバーフロー) した場合、または数値変換エラーが発生した場合には、その結果は NULL 値となります。 他の NULL 値の場合と同様に、標識変数を用意しなければなりません。メイン変数は変更されません。 しかし、この場合、標識変数が -2 に設定されます。 ステートメントの処理は、エラーが起こらなかったものとして続行されます。 (ただし、このエラーの場合は SQLCODE が正になります。)
標識変数を用意していない場合には、SQLCA の SQLCODE フィールドに負の値が戻されます。 エラーが検出されると、ステートメントの処理は終了します。 その時のホスト変数またはそれ以降の変数には、値は割り当てられません。ただし、既に変数に割り当てられている値は、割り当てられたままの状態となります。 また、行セット位置付け FETCH 時に行のホールが検出された場合、アプリケーションによって指定されたすべての標識に -3 が戻され、その行の値は戻されません。 ホールが検出された場合に、標識変数がアプリケーションによって少なくとも 1 つ指定されていなければ、ステートメントの処理は終了します。
- 代替構文およびシノニム:
- USING DESCRIPTOR は INTO DESCRIPTOR のシノニムとして指定できます。
例 FETCH
- 例 1
- FETCH ステートメントは、SELECT ステートメントの結果を取り出し、アプリケーション・プログラム変数 DNUM、DNAME、および MNUM に入れます。 取り出す行がなくなった場合、見つからないことを示す状態が戻されます。
EXEC SQL DECLARE C1 CURSOR FOR SELECT DEPTNO, DEPTNAME, MGRNO FROM DSN8C10.DEPT WHERE ADMRDEPT = 'A00'; EXEC SQL OPEN C1; DO WHILE (SQLCODE = 0); EXEC SQL FETCH C1 INTO :DNUM, :DNAME, :MNUM; END; EXEC SQL CLOSE C1; - 例 2
- 動的両方向スクロール・カーソルを使用する FETCH ステートメントの例については、例 8を参照してください。
- 例 3
- C1 カーソルを使用して C1: 結果表の最後の 5 行をフェッチします。
FETCH ROWSET STARTING AT ABSOLUTE -5 FROM C1 FOR 5 ROWS INTO DESCRIPTOR :MYDESCR; - 例 4
- カーソル CURS1 の行 10 から 6 行をフェッチし、データを 3 つのホスト変数配列にフェッチします。
また、INTO DESCRIPTOR 文節に記述子を指定することもできます。この場合、SQLDA の情報はホスト変数配列のデータ・タイプを反映します。FETCH ROWSET STARTING AT ABSOLUTE 10 FROM CURS1 FOR 6 ROWS INTO :hav1, :hva2, :hva3;FETCH ROWSET STARTING AT ABSOLUTE 10 FROM CURS1 FOR 6 ROWS INTO DESCRIPTOR :MYDESCR; - 例 5
以下の配列タイプ、配列変数、およびテーブルが定義されているとします。
CREATE TYPE INTARRAY AS INTEGER ARRAY[100]; CREATE TABLE T1 (COL1 CHAR(10), COL2 INT);FETCH ステートメントの出力ターゲットとして配列変数を使用します。 配列変数は、FETCH ステートメントの INTO 文節内に指定されます。
CREATE PROCEDURE PROCESSINTARRAY (OUT INTOUTARRAY INTARRAY) BEGIN DECLARE INTA INTARRAY; DECLARE INTB INTARRAY; DECLARE INTV INTEGER DEFAULT 1; DECLARE STMT CHAR(100); DECLARE C2 CURSOR FOR S1; -- -- Initialize the array -- SET INTA = ARRAY[1,INTEGER(2),3+0,4,5,6] ; -- -- Use dynamic SQL with an array parameter marker and a parameter marker -- containing the index to retrieve the value from the array parameter. -- The array is referenced in a predicate. -- SET STMT = 'SELECT COL1 FROM T1 WHERE COL2 = CAST(? AS INTARRAY)[?]'; PREPARE S1 FROM STMT; OPEN C2 USING INTA, INTV; FETCH C2 INTO INTB ; -- INTB is an array variable that is used -- as a target for the fetch statement. CLOSE C2; SET INTOUTARRAY=INTB; END
