例: カーソルの使用

次の例では、シリアル・カーソルとスクロール可能カーソルを定義して処理するためにプログラムに組み込める SQL ステートメントを示します。

プログラムで部門 D11 の社員についてのデータを調べるとします。 シリアルまたはスクロール可能カーソルを使用すると、CORPDATA.EMPLOYEE 表からその部門に関する情報を取り出すことができます。

シリアル・カーソルの例では、プログラムは表から取り出したすべての行を処理して、部門 D11 の全社員の職種を更新し、他の部門からの社員のレコードを削除します。

表 1. シリアル・カーソルの例
シリアル・カーソル用の SQL ステートメント 参照ページ
EXEC SQL
DECLARE THISEMP CURSOR FOR
SELECT EMPNO, LASTNAME,
WORKDEPT, JOB
FROM CORPDATA.EMPLOYEE
FOR UPDATE OF JOB
END-EXEC。
ステップ 1: カーソルの定義
EXEC SQL
OPEN THISEMP
END-EXEC。
ステップ 2: カーソルを開く
EXEC SQL
WHENEVER NOT FOUND
GO TO CLOSE-THISEMP
END-EXEC。
ステップ 3: データの終わりに達したときの処置を指定する
EXEC SQL
FETCH THISEMP
INTO :EMP-NUM, :NAME2,
:DEPT, :JOB-CODE
END-EXEC
ステップ 4: カーソルを使用して行を取り出す
...
部門 D11のすべての従業員について、
JOB 値

EXEC SQL
UPDATE CORPDATA.EMPLOYEE
SET JOB = :NEW-CODE
WHERE CURRENT OF THISEMP
END-EXEC.

... 行を印刷します。
ステップ 5a: 現在行を更新します
... 他の従業員の場合は、
行を削除します:

EXEC SQL
DELETE FROM CORPDATA.EMPLOYEE
WHERE CURRENT OF THISEMP
END-EXEC。
ステップ 5b: 現在行を削除します
FETCH に戻り、次の行を処理する。  
CLOSE-THISEMP.
EXEC SQL
CLOSE THISEMP
END-EXEC。
ステップ 6: カーソルをクローズする

スクロール可能カーソルの例では、プログラムは RELATIVE 位置オプションを使用して、部門 D11 の代表的な給与例を取り出します。

表 2. スクロール可能カーソルの例
スクロール可能カーソル用の SQL ステートメント 参照ページ
EXEC SQL
DECLARE THISEMP DYNAMIC SCROLL CURSOR FOR
SELECT EMPNO, LASTNAME,
SALARY
FROM CORPDATA.EMPLOYEE
WHERE WORKDEPT = 'D11'
END-EXEC。
ステップ 1: カーソルの定義
EXEC SQL
OPEN THISEMP
END-EXEC。
ステップ 2: カーソルを開く
EXEC SQL
WHENEVER NOT FOUND
GO TO CLOSE-THISEMP
END-EXEC。
ステップ 3: データの終わりに達したときの処置を指定する
... プログラムの合計
給与変数
EXEC SQL
FETCH RELATIVE 3 FROM THISEMP
INTO :EMP-NUM, :NAME2,
:JOB-CODE
END-EXEC
を初期化します。現在の給与を
プログラム合計給与
に追加して、フェッチし、
次の行を処理します。
ステップ 4: カーソルを使用して行を取り出す
... 平均
給与の計算
 
CLOSE-THISEMP.
EXEC SQL
CLOSE THISEMP
END-EXEC。
ステップ 6: カーソルをクローズする