行カーソルの宣言

行位置付けカーソルを使用して行を取り出すには、その前にカーソルを宣言する必要があります。 カーソルを宣言する際には、カーソルを使用してアクセスする行のセットを指定する必要があります。

プロシージャー

行カーソルを宣言するには、DECLARE CURSOR ステートメントを発行します。

DECLARE CURSOR ステートメントは、カーソルに名前を付け、 SELECT ステートメントを指定します。 SELECT ステートメントは、 結果表を構成する行の基準を定義します。

次の例は、単純形式の DECLARE CURSOR ステートメントを示しています。

EXEC SQL
  DECLARE C1 CURSOR FOR
    SELECT EMPNO, FIRSTNME, MIDINIT, LASTNAME, SALARY
      FROM DSN8D10.EMP
  END-EXEC.

このカーソルを使用すると、従業員に関する選択情報をリストできます。

もっと複雑なカーソルでは、WHERE 文節を含んだり、複数の表の結合を 含むこともできます。 例えば、カーソルを使用して、特定のプロジェクトで 働く従業員をリストしたいとします。 それらの従業員を選別するために、 次のようにカーソルを宣言します。

EXEC SQL
  DECLARE C2 CURSOR FOR
    SELECT EMPNO, FIRSTNME, MIDINIT, LASTNAME, SALARY
      FROM DSN8D10.EMP X
      WHERE EXISTS
        (SELECT *
           FROM DSN8D10.PROJ Y
           WHERE X.EMPNO=Y.RESPEMP
           AND Y.PROJNO=:GOODPROJ);
マルチレベル・セキュリティーを使用する表に対するカーソルの宣言
行レベルの細分化でマルチレベル・セキュリティーを使用する表から行を取り出すカーソルを宣言できます。 しかし、このカーソルに対する結果表は、 ご使用の ID のセキュリティー・ラベル値と同じか、あるいはそれに支配されるセキュリティー・ラベル値 を持つ、これらの行のみを含みます。
列の更新
取り出す行の中の列を更新できます。 カーソルを使用して行を取り出した後に、その行を更新する ことを位置付け 更新と呼びます。 指示した表で位置付け更新を行おうとする場合は、FOR UPDATE 文節を 組み込んでください。 FOR UPDATE 文節には、以下の 2 つの形式があります。
  • 1 つ目の 形式は、FOR UPDATE OF 列リスト です。 この形式は、どの列を更新 すべきかが前もって分かっている場合に、使用します。
  • 2 番目の形式は、列リストなしの FOR UPDATE です。 この形式 は、カーソルを使って表のどの列も更新できるようにする場合に、使用します。

例えば、次のカーソルを使って、従業員表の SALARY 列だけを更新 することができます。

EXEC SQL
  DECLARE C1 CURSOR FOR
    SELECT EMPNO, FIRSTNME, MIDINIT, LASTNAME, SALARY
      FROM DSN8D10.EMP X
      WHERE EXISTS
        (SELECT *
           FROM DSN8D10.PROJ Y
           WHERE X.EMPNO=Y.RESPEMP
           AND Y.PROJNO=:GOODPROJ)
    FOR UPDATE OF SALARY;

また、カーソルを使って従業員表のどの列も更新する可能性があるのであれば、 次のようにカーソルを定義します。

EXEC SQL
  DECLARE C1 CURSOR FOR
    SELECT EMPNO, FIRSTNME, MIDINIT, LASTNAME, SALARY
      FROM DSN8D10.EMP X
      WHERE EXISTS
        (SELECT *
           FROM DSN8D10.PROJ Y
           WHERE X.EMPNO=Y.RESPEMP
           AND Y.PROJNO=:GOODPROJ)
    FOR UPDATE;

Db2列リストでFORUPDATE節を使用する場合は、列リストを使用してFOR UPDATE節を使用する場合よりも、より多くの処理を実行する必要があります。 したがって、表の中の一部の列だけを更新すればよいとき は、列リストを指定すると、プログラムの効率が上がります。

プリコンパイラー・オプションの NOFOR と STDSQL は、静的 SQL ステートメント の FOR UPDATE 文節の使用に影響します。 DECLARE CURSOR ステートメントで FOR UPDATE 文節を指定せず、 かつ STDSQL(YES) オプションまたは NOFOR プリコンパイラー・オプションを 指定せずに、位置付け UPDATE ステートメントを実行すると、 エラーを受け取ります。

指定した表の列は、それが結果表に含まれない場合でも更新することができます。 この 場合、SELECT ステートメントにその列の名前を指定する必要はありません。 カーソルが更新する列値を含む行を(FETCHを使用して)取得する場合、UPDATEを使用できます… WHERE CURRENT OFは、更新される行を識別します。

読み取り専用の結果表
結果表によっては、 例えば、複数の表を結合した結果などのように更新できない 表があります。