行カーソルを使用した SQL ステートメントの実行
行カーソルを使用して、FETCH ステートメント、位置付け UPDATE ステートメント、および位置付け DELETE ステートメントを実行できます。
このタスクについて
FETCH ステートメントは、以下のいずれかの目的で実行します。
- 結果表の 1 行からのデータを 1 つ以上のホスト変数にコピーする
- 位置付け UPDATE または位置付け DELETE 操作を実行する前にカーソルを位置付ける
EXEC SQL
FETCH C1 INTO
:HV-EMPNO, :HV-FIRSTNME, :HV-MIDINIT, :HV-LASTNAME, :HV-SALARY :IND-SALARY
END-EXEC.DECLARE CURSORステートメント内のSELECTステートメントは、行をフェッチする結果表を識別しますが、Db2はアプリケーションプログラムがFETCHステートメントを実行するまでデータを取得しません。
プログラムが FETCH ステートメントを実行すると、 Db2 はカーソルを結果表の行に置きます。 この行を、現在行 と呼びます。 Db2 次に、FETCH の INTO 節で指定したプログラムホスト変数に、現在の行の内容をコピーします。 この手順は、 結果表のすべての行を処理するまで、FETCH を出すたびに繰り返されます。
FETCHステートメントを実行するときに指す行 Db2は、カーソルがスクロール可能またはスクロール不可として宣言されているかどうかによって異なります。
FETCH によってリモート・サブシステムを照会するときは、ブロック・フェッチを使用してパフォーマンスをよくすることを考えてください。 ブロック・フェッチは、 現在行より前にある行を処理します。 位置付け UPDATE または DELETE の操作を行う場合は、 ブロック・フェッチは使用できません。
現在行を取り出すために FETCH ステートメントを実行した後、その行のデータを
変更するために位置付け UPDATE ステートメントを使用でき
ます。 位置付け UPDATE ステートメントの例を次に示します。
EXEC SQL
UPDATE DSN8C10.EMP
SET SALARY = 50000
WHERE CURRENT OF C1
END-EXEC.位置付け UPDATE ステートメントは、 カーソルが位置付けられた行を更新します。
位置付け UPDATE ステートメントは、以下の制約事項に左右されます。
- 行を更新すると何らかの固有制約、検査制約、または参照制約に違反する場合、 その行は更新できない。
- UPDATE ステートメントを使用して、 作成済みの一時表の行を変更できない。 しかし、宣言済み一時表の行を変更する場合は、UPDATE ステートメントを使用できる。
- UPDATE ステートメントの SET 文節の右側に全選択が入っている場合は、 その全選択に、更新される表の相関名を入れることはできない。
- 位置付け UPDATE ステートメントで使用するカーソルを定義する、SELECT ステートメントの FROM 文節で SQL データ変更ステートメントを使用できない。
- カーソルが位置付けられた行のセキュリティー・ラベル列の値が ユーザー ID のセキュリティー・ラベルの値と同じでない場合、 位置付け UPDATE ステートメントは失敗する。 ユーザー ID に記録特権がある場合は、 カーソルが位置付けられた行のセキュリティー・ラベル列の値が ユーザー ID のセキュリティー・ラベルの値より上位にない場合、 位置付け UPDATE ステートメントは失敗する。
現在行を取り出すために FETCH ステートメントを実行した後、その行を
削除するために位置付け DELETE ステートメントを使用でき
ます。 位置付け DELETE ステートメントの例を次に示します。
EXEC SQL
DELETE FROM DSN8C10.EMP
WHERE CURRENT OF C1
END-EXEC.位置付け DELETE ステートメントは、 カーソルが位置付けられた行を削除します。
位置付け DELETE ステートメントは、以下の制約事項に左右されます。
- カーソルに DELETE ステートメントを使用して、 作成済みの一時表から行を削除できない。 しかし、宣言済み一時表から行を削除する場合は、 カーソルに DELETE ステートメントを使用できる。
- ある行を削除した後、FETCH ステートメントを実行してカーソルを別の 行に位置づけるまでは、そのカーソルを使用して別の行を更新したり、 削除したりすることはできない。
- 行の削除が何らかの参照制約に違反する場合は、その行は削除できない。
- 位置付け DELETE ステートメントで使用するカーソルを定義する、SELECT ステートメントの FROM 文節で SQL データ変更ステートメントを使用できない。
- カーソルが位置付けられた行のセキュリティー・ラベル列の値が ユーザー ID のセキュリティー・ラベルの値と同じでない場合、 位置付け DELETE ステートメントは失敗する。 ユーザー ID に記録特権がある場合は、 カーソルが位置付けられた行のセキュリティー・ラベル列の値が ユーザー ID のセキュリティー・ラベルの値より上位にない場合、 位置付け DELETE ステートメントは失敗する。