Обсуждение: perl use of cursors and fetch forward
Can someone tell me how to use Postgres cursors through perl? A sample is below. Is there some way to keep the transaction active between $conn-exec calls? #!/usr/local/bin/perl use Pg; my $conn = Pg::connectdb("dbname = test"); my $result = $conn->exec("begin work; declare c1 cursor for select fld1 from tbl1 ; "); $result = $conn->exec("fetch forward 1 in c1;"); print "Hurray, I fetched a row: " . $result->fetchrow . "\n"; $result = $conn->exec("end work;"); jrf@roog:~/$ perl test_cursor.pl NOTICE: PerformPortalFetch: portal "c1" not found Hurray, I fetched a row: NOTICE: COMMIT: no transaction in progress jrf@roog:~/$
dooh. never mind. this works if the "begin work;" and "declare ...;" are in separate exec requests. On Mon, 29 Jan 2001, John Frank wrote: > > Can someone tell me how to use Postgres cursors through perl? A sample is > below. Is there some way to keep the transaction active between > $conn-exec calls? > > #!/usr/local/bin/perl > use Pg; > my $conn = Pg::connectdb("dbname = test"); > > my $result = $conn->exec("begin work; declare c1 cursor for select fld1 > from tbl1 ; "); > > $result = $conn->exec("fetch forward 1 in c1;"); > print "Hurray, I fetched a row: " . $result->fetchrow . "\n"; > > $result = $conn->exec("end work;"); > > > > jrf@roog:~/$ perl test_cursor.pl > NOTICE: PerformPortalFetch: portal "c1" not found > Hurray, I fetched a row: > NOTICE: COMMIT: no transaction in progress > jrf@roog:~/$ > > > > > >
John Frank <jrf@segovia.mit.edu> writes: > this works if the "begin work;" and "declare ...;" are in separate exec > requests. This is fixed for 7.1. The problem in 7.0 is that the check for "are we inside a transaction block?" is done at the wrong time, ie, during initial parsing of the query string ... regards, tom lane