UPDATE (位置指定)

構文:

             
>>---EXEC SQL---.-----------------.--.------------.----->
                +--FOR :host_integer-+  +-AT db_name-+  

                                  +------ ,--------+
                                  V                |
 >---UPDATE---table_name-----SET--column_expression----->

 >--WHERE CURRENT OF--cursor_name---END-EXEC---><

パラメーター:

host_integer 処理されるホスト配列要素の最大数を指定するホスト変数。PIC S9(4) COMP-5 または PIC S9(9) COMP-5 として宣言する必要があります。
db_name DECLARE DATABASE を使用して宣言されているデータベースの名前。
table_name 更新するテーブル。
column_expression 特定の列名の値。この値には式または NULL 値が使用できます。
cursor_name 宣言後に開かれ、取り込まれたカーソル。

コメント:

UPDATE が DECLARE CURSOR 文の一部である場合は、FOR 句を使用しないでください。

実行後に、SQLERRD(3) には処理された要素の数が含まれます。UPDATE の場合、これは更新された行の合計数です。

ODBC は位置指定更新をサポートします。位置指定更新では、拡張構文でカーソルを使用して、最後に取り込まれた行を更新します (ODBC 1.0 では主要構文で更新されていましたが、ODBC 2.0 では拡張構文に移行しました)。すべてのドライバーが位置指定更新をサポートしているわけではありません。 ただし、OpenESQL では、位置指定更新および位置指定削除が容易にできるように、ODBC カーソル名を COBOL カーソル名と同じ名前に設定します。

ODBC ドライバーによっては、位置指定更新を有効にするために、カーソルで使用される SELECT 文に FOR UPDATE 句を含める必要があります。

標準 SQL 文で使用される UPDATE のもう 1 つの形式は、検索更新と呼ばれます。

位置指定更新ではホスト配列を使用できません。

ほとんどのデータソースでは、特定の組み合わせの SCROLLOPTION と CONCURRENCY を SET 文または DECLARE CURSOR 文で指定する必要があります。

ODBC カーソルのライブラリにより、位置指定更新の制限付き実装が提供されます。 SQL(USECURLIB=YES) でコンパイルし、SCROLLOPTION STATIC および CONCURRENCY OPTCCVAL (または OPTIMISTIC) を使用することによって、その更新を行うことができます。

例:

     EXEC SQL CONNECT TO 'srv1' USER 'sa' END-EXEC

     EXEC SQL DECLARE C1 CURSOR FOR
        SELECT last_name, first_name
        FROM staff
        FOR UPDATE
     END-EXEC     
    
     EXEC SQL
        OPEN C1
     END-EXEC

     PERFORM UNTIL SQLCODE NOT = ZERO

        EXEC SQL
            FETCH C1 INTO :fname,:lname
        END-EXEC

        IF SQLCODE = ZERO
           DISPLAY fname " " lname
           DISPLAY "Update?" 
           ACCEPT reply
           IF reply = "y"
              DISPLAY "New last name?" 
              ACCEPT lname
              EXEC SQL
                 UPDATE staff 
                 SET last_name=:lname WHERE CURRENT OF c1
              END-EXEC
              DISPLAY "update sqlcode=" SQLCODE
            END-IF
        END-IF
     END-PERFORM

     EXEC SQL DISCONNECT ALL END-EXEC
     STOP RUN.