例: カーソルの使用
次の例では、シリアル・カーソルとスクロール可能カーソルを定義して処理するためにプログラムに組み込める SQL ステートメントを示します。
プログラムで部門 D11 の社員についてのデータを調べるとします。 シリアルまたはスクロール可能カーソルを使用すると、CORPDATA.EMPLOYEE 表からその部門に関する情報を取り出すことができます。
シリアル・カーソルの例では、プログラムは表から取り出したすべての行を処理して、部門 D11 の全社員の職種を更新し、他の部門からの社員のレコードを削除します。
| シリアル・カーソル用の 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 の代表的な給与例を取り出します。
| スクロール可能カーソル用の 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: カーソルをクローズする。 |