| 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? | 
|---|---|
| Genero db | Yes (if primary key or unique index) | 
| 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
DECLARE c1 CURSOR FOR SELECT key FROM master ...
DECLARE c2 CURSOR FOR SELECT * FROM master WHERE key=? FOR UPDATE
FOREACH c1 INTO mrec.key
  BEGIN WORK
  OPEN c2 USING mrec.key
  FETCH c2 INTO rec.*
  IF STATUS==NOTFOUND THEN
     ROLLBACK WORK
     CONTINUE FOREACH
  END IF
  UPDATE master SET ... WHERE CURRENT OF c2
  UPDATE detail SET ... WHERE mkey=mrec.key
  COMMIT WORK
END FOREACH