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.