Bisher haben Sie Cursor gesehen, die nur innerhalb einer Transaktion leben. Es gibt in PostgreSQL allerdings auch die Möglichkeit, Cursor über Transaktionsgrenzen hinweg am Leben zu halten. Um das zu bewerkstelligen, müssen Sie einen Cursor als WITH HOLD definieren:
test=# BEGIN; BEGIN test=# DECLARE mycursor CURSOR WITH HOLD FOR SELECT * FROM t_passwd; DECLARE CURSOR test=# FETCH NEXT FROM mycursor; account | passwd | uid | gid | gecos | directory | shell ---------+--------+-----+-----+-------+-----------+----------- root | x | 0 | 0 | root | /root | /bin/bash (1 row)
Obwohl wir ein COMMIT machen, ist der Cursor noch am Leben:
test=# COMMIT; COMMIT test=# FETCH NEXT FROM mycursor; account | passwd | uid | gid | gecos | directory | shell ---------+--------+-----+-----+-------+-----------+--------------- bin | x | 1 | 1 | bin | /bin | /sbin/nologin (1 row) test=# CLOSE mycursor; CLOSE CURSOR
Das explizite Schließen des Cursors ist vor allem für das Cleanup von entscheidender Bedeutung.