Cursors have somewhat non-transactional behavior with respect to
savepoints. Any cursor that is opened inside a savepoint will be closed
when the savepoint is rolled back. If a previously opened cursor is
- affected by a
- FETCH> command inside a savepoint that is later rolled
- back, the cursor position remains at the position that FETCH>
- left it pointing to (that is, FETCH> is not rolled back).
+ affected by a FETCH> or MOVE> command inside a
+ savepoint that is later rolled back, the cursor remains at the
+ position that FETCH> left it pointing to (that is, the cursor
+ motion caused by FETCH> is not rolled back).
Closing a cursor is not undone by rolling back, either.
+ However, other side-effects caused by the cursor's query (such as
+ side-effects of volatile functions called by the query) are>
+ rolled back if they occur during a savepoint that is later rolled back.
A cursor whose execution causes a transaction to abort is put in a
cannot-execute state, so while the transaction can be restored using
ROLLBACK TO SAVEPOINT>, the cursor can no longer be used.