表のデータの検索と更新

行のデータは、カーソルを使用することにより、検索と同時に更新することができます。

選択ステートメントで、FOR UPDATE OF を指定し、その後に更新可能な列のリストを続けます。そして、カーソルにより制御される UPDATE ステートメントを使用してください。更新したい行を指し示すカーソルの名前は、WHERE CURRENT OF 文節で指定します。 FOR UPDATE OF、ORDER BY、FOR READ ONLY、または DYNAMIC 文節を持たない SCROLL 文節を指定しなかった場合は、 すべての列を更新できます。

複数行用 FETCH ステートメントを指定して実行した場合には、カーソルはそのブロックの最後の行に置かれています。したがって、UPDATE ステートメントに WHERE CURRENT OF 文節の指定があると、ブロックの最後の行が更新されます。 ブロック内のある行を更新しなければならない場合には、プログラムではまずカーソルをその行に移動する必要があります。その後、UPDATE WHERE CURRENT OF を指定することができます。次の例を検討してください。

表 1. 表の更新
スクロール可能カーソル用の SQL ステートメント 注釈

EXEC SQL
  DECLARE THISEMP DYNAMIC SCROLL CURSOR FOR
  SELECT EMPNO, WORKDEPT, BONUS
     FROM CORPDATA.EMPLOYEE
     WHERE WORKDEPT = 'D11'
     FOR UPDATE OF BONUS
END-EXEC.

 

EXEC SQL
  OPEN THISEMP
END-EXEC.

 

EXEC SQL
  WHENEVER NOT FOUND
    GO TO CLOSE-THISEMP
END-EXEC.

 

EXEC SQL
  FETCH NEXT FROM THISEMP
    FOR 5 ROWS
    INTO :DEPTINFO :IND-ARRAY
END-EXEC.

DEPTINFO と IND-ARRAY は、プログラムの中ではホスト構造配列および標識配列として宣言されます。
... 部門 D11 の中で受け取った賞与の金額が $500.00 未満の社員がいるかどうかを判別する。もしいれば、そのレコードを新たな最低金額 $500.00 として更新する。  

EXEC SQL
  FETCH RELATIVE :NUMBACK FROM THISEMP
END-EXEC.

... ブロック内の該当レコードに移動し、逆順の検索によって更新する。

EXEC SQL
  UPDATE CORPDATA.EMPLOYEE
    SET BONUS = 500
    WHERE CURRENT OF THISEMP
END-EXEC.

... 部門 D11 の社員の中で新たな最低金額 $500.00 未満のものの賞与を更新する。

EXEC SQL
  FETCH RELATIVE :NUMBACK FROM THISEMP
    FOR 5 ROWS
    INTO :DEPTINFO :IND-ARRAY
END-EXEC.

... すでに検索を行った同じブロックの先頭に移動し、もう一度ブロックを検索する。(NUMBACK -(5 - NUMBACK - 1))

... ブランチで戻り、そのブロック内に賞与が $500.00 未満の社員が他にもいるかどうか判別する。

... ブランチで戻り、次の行ブロックをフェッチして処理する。

 

CLOSE-THISEMP.
EXEC SQL
  CLOSE THISEMP
END-EXEC.