re-executing prepared statement leads to 'Modification of a read-only value attempted'

paul lucassen <[email protected]>
Newsgroups gmane.comp.db.mysql.perl
Organization Huijsmans en Kuijpers Automatisering BV
Message-ID <[email protected]>
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

-- 
MySQL Perl Mailing List
For list archives: http://lists.mysql.com/perl
To unsubscribe:    http://lists.mysql.com/[email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.