SQL programming / SQL portability |
Hold cursors and not portable.
IBM® Informix® supports WITH HOLD cursors using the FOR UPDATE clause. Such cursors can remain open across transactions (when using FOR UPDATE, locks are released at the end of a transaction, but the WITH HOLD cursor is not closed). This kind of cursor is IBM Informix-specific and not portable. The SQL standards recommend closing FOR UPDATE cursors and release locks at the end of a transaction. Most database servers close FOR UPDATE cursors when a COMMIT WORK or ROLLBACK WORK is done. All database servers release locks when a transaction ends.
Database Server Type | WITH HOLD FOR UPDATE supported? |
---|---|
IBM DB2® UDB | No |
IBM Informix | Yes |
Microsoft™ SQL Server | No |
MySQL | No |
Oracle Database Server | No |
PostgreSQL | No |
Sybase ASE | No |
SQLite | No |
It is mandatory to review code using WITH HOLD cursors with a SELECT statement having the FOR UPDATE clause.
DECLARE c1 CURSOR FOR SELECT ... FOR UPDATE BEGIN WORK OPEN c1 FETCH c1 INTO ... UPDATE ... COMMIT WORK
DEFINE x, mkeys DYNAMIC ARRAY OF INTEGER DECLARE c1 CURSOR FOR SELECT key FROM master ... FOREACH c1 INTO x LET mkeys[mkeys.getLength()+1] = x END FOREACH DECLARE c2 CURSOR FOR SELECT * FROM master WHERE key=? FOR UPDATE FOR x = 1 TO mkeys.getLength() BEGIN WORK OPEN c2 USING mkeys[x] FETCH c2 INTO mrec.* IF STATUS==NOTFOUND THEN ROLLBACK WORK CONTINUE FOREACH END IF UPDATE master SET ... WHERE CURRENT OF c2 UPDATE detail SET ... WHERE master_key=mkeys[x] COMMIT WORK END FOR