ODBC supports positioned update, which updates the row most recently fetched by using a cursor. However, not all drivers provide support for positioned update.
With some ODBC drivers, the select statement used by the cursor must contain a FOR UPDATE clause to enable positioned update. Most data sources require specific combinations of SCROLLOPTION and CONCURRENCY to be specified either by SET statements or in the DECLARE CURSOR statement. If this fails to work, the ODBC Cursor Library provides a restricted implementation of positioned update which can be enabled by compiling with the directive SQL(USECURLIB=YES) and using SCROLLOPTION STATIC and CONCURRENCY OPTCCVAL (or OPTIMISTIC). To avoid multiple rows being updated when using the ODBC Cursor Library, the cursor query should include the primary key column(s) for the table to be updated.
Example
$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.