1 message in com.mysql.lists.perlre-executing prepared statement leads...| From | Sent On | Attachments |
|---|---|---|
| paul lucassen | 12 Jun 2006 04:22 |
| Subject: | re-executing prepared statement leads to 'Modification of a read-only value attempted'![]() |
|---|---|
| From: | paul lucassen (pa...@bicat.com) |
| Date: | 06/12/2006 04:22:10 AM |
| List: | com.mysql.lists.perl |
Hi,
While playing with the examples from the eg/ directory (DBD-mysql-3.0006_1) I took proc_example3.pl and copied the $sth->execute and the subsequent do-block. The second execution then leads to a Modification of a read-only value attempted at the line with while (@row= $sth->fetchrow_array()). (The problem here is with $sth)
My environment: SLES9 with stock perl (5.8.3), Mysql 5.0.21, DBI 1.51, DBD::mysql 3.0006_1.
The test-script:
#!/usr/bin/perl
use DBI;
$DATABASE='test'; $HOST='localhost'; $PORT=3306; $USER='root'; $PASSWORD='';
$dbh = DBI->connect("DBI:mysql:$DATABASE:$HOST:$PORT", "$USER", "$PASSWORD", { PrintError => 0}) || die $DBI::errstr;
$dbh->trace(3, "./dbd.log");
$dbh->do("drop procedure if exists testproc") or print $DBI::errstr;
$dbh->do("create procedure testproc() deterministic begin declare a,b,c,d,e,f int; set a=1; set b=2; set c=3; set d=4; set e=5; set f=6; select a, b, c, d; select d, c, b, a; select b, a, c, d; select c, b, d, a; select a, d; select a, b, c, d, e, f; select f; end") or print $DBI::errstr;
$sth=$dbh->prepare('call testproc()') || die $DBI::err.": ".$DBI::errstr;
$sth->execute || die DBI::err.": ".$DBI::errstr; $rowset=0; do { print "\nRowset ".++$i."\n---------------------------------------\n\n"; foreach $colno (0..$sth->{NUM_OF_FIELDS}) { print $sth->{NAME}->[$colno]."\t"; } print "\n"; while (@row= $sth->fetchrow_array()) { foreach $field (0..$#row) { print $row[$field]."\t"; } print "\n"; } } until (!$sth->more_results) ;
$sth->execute || die DBI::err.": ".$DBI::errstr; $rowset=0; do { print "\nRowset ".++$i."\n---------------------------------------\n\n"; foreach $colno (0..$sth->{NUM_OF_FIELDS}) { print $sth->{NAME}->[$colno]."\t"; } print "\n"; while (@row= $sth->fetchrow_array()) { foreach $field (0..$#row) { print $row[$field]."\t"; } print "\n"; } } until (!$sth->more_results) ;
The result:
Rowset 1
---------------------------------------
a b c d 1 2 3 4
Rowset 2
---------------------------------------
d c b a 4 3 2 1
Rowset 3
---------------------------------------
b a c d 2 1 3 4
Rowset 4
---------------------------------------
c b d a 3 2 4 1
Rowset 5
---------------------------------------
a d 1 4
Rowset 6
---------------------------------------
a b c d e 1 2 3 4 5 6
Rowset 7
---------------------------------------
f 6
Rowset 8
---------------------------------------
a b c d Modification of a read-only value attempted at ./tt.pl line 62.
Is this faulty behavior or am I using it the wrong way?
Thanks for any help,
Paul Lucassen




