ODBC は、位置指定更新をサポートします。位置指定更新では、カーソルを使用して最後に取り込まれた行が更新されます。ただし、位置指定更新をサポートしないドライバーもあります。
ODBC ドライバーによっては、位置指定更新を有効にするために、カーソルで使用される SELECT 文に FOR UPDATE 句を含める必要があります。ほとんどのデータソースでは、特定の組み合わせの SCROLLOPTION と CONCURRENCY を SET 文または DECLARE CURSOR 文で指定する必要があります。これが機能しない場合は、ODBC カーソル ライブラリにより、位置指定更新が制限されて実装されます。この位置指定更新は、指令 SQL(USECURLIB=YES) および SCROLLOPTION STATIC と CONCURRENCY OPTCCVAL (または OPTIMISTIC) を使用してコンパイルすると有効化できます。ODBC カーソル ライブラリを使用しているときに複数の行が更新されないようにするには、カーソル クエリで、更新するテーブルに主キーカラムを含めます。
例
$SET SQL(usecurlib=yes)
WORKING-STORAGE SECTION.
EXEC SQL INCLUDE SQLCA END-EXEC
*> after an sql error this has the full message text
01 MFSQLMESSAGETEXT PIC X(250).
01 IDX PIC X(04) COMP-5.
EXEC SQL BEGIN DECLARE SECTION END-EXEC
*> Put your host variables here if you need to port
*> to other COBOL compilers
EXEC SQL INCLUDE Products END-EXEC
EXEC SQL END DECLARE SECTION END-EXEC
PROCEDURE DIVISION.
EXEC SQL
WHENEVER SQLERROR perform OpenESQL-Error
END-EXEC
*> Demo for positioned updates using ACCESS datasource
EXEC SQL
CONNECT TO 'Inventory' USER 'admin'
END-EXEC
*> Put your program logic/SQL statements here
EXEC SQL
DECLARE CSR679 CURSOR
FOR SELECT
A.ProductID
,A.ProductName
,A.UnitPrice
FROM Products A
WHERE ( A.ProductID < 3 )
END-EXEC
EXEC SQL SET SCROLLOPTION static END-EXEC
EXEC SQL SET CONCURRENCY optccval END-EXEC
EXEC SQL OPEN CSR679 END-EXEC
PERFORM UNTIL SQLSTATE >= "02000"
EXEC SQL
FETCH CSR679 INTO
:ProductID
,:ProductName:ProductName-NULL
,:UnitPrice:UnitPrice-NULL
END-EXEC
*> Process data from FETCH
IF SQLSTATE = "00000"
*> increase price by 10%
compute unitprice = unitprice * 1.10
EXEC SQL
UPDATE Products
SET UnitPrice = :UnitPrice:UnitPrice-NULL
WHERE CURRENT OF CSR679
END-EXEC
END-IF
END-PERFORM
EXEC SQL CLOSE CSR679 END-EXEC
EXEC SQL COMMIT END-EXEC
EXEC SQL DISCONNECT CURRENT END-EXEC
EXIT PROGRAM.
STOP RUN.
*> Default sql error routine - modify to stop program if
*> needed
OpenESQL-Error Section.
display "SQL Error = " sqlstate " " sqlcode
display MFSQLMESSAGETEXT
*> stop run
exit.