On Apr 13, 2010, at 1:56 AM, Tim Bunce wrote:
However, when I put any sort of an update command after that, as in:
while ( @xml_content = $sth->fetchrow_array() ) {
$sth = $dbh->prepare("SELECT msgid, xmlcontent FROM messages WHERE
msgid = 1892362");
print "Message ID = $msgid\n";
$sth->execute();
$update_cmd = "UPDATE messages SET alteredcontent = '$alteredmsg'
WHERE msgid = $msg_id";
$sth = $dbh->do($update_cmd);
}
$sth is the handle to your cursor that you're iterating through. When
you redefine it in the first line, you kill the one you were iterating
through, ergo no more lines.
The proper (Perl, that is, dunno about the SQL...) is to use more than
one cursor:
while ( @xml_content = $sth->fetchrow_array() ) {
$sth2 = $dbh->prepare("SELECT msgid, xmlcontent FROM messages WHERE
msgid = 1892362");
print "Message ID = $msgid\n";
$sth2->execute();
[I presume there's some missing steps in here, because otherwise
absolutely nothing has happened....]
$update_cmd = "UPDATE messages SET alteredcontent = '$alteredmsg'
WHERE msgid = $msg_id";
$dbh->do($update_cmd);
}
Also, doing 'prepare()' like this inside of a loop is horribly
inefficient, and can easily be avoided by doing the prepare statement
outside the look with execution parameters, then put the value of the
parameter in the execute() statement:
$sth2 = $dbh->prepare("SELECT msgid, xmlcontent FROM messages WHERE
msgid = ?");
while ( @xml_content = $sth->fetchrow_array() ) {
print "Message ID = $msgid\n";
$sth2->execute(1892362);
....
This is a LOT faster, from experience.
Also "SELECT msgid, xmlcontent FROM messages WHERE msgid = 1892362" is
also mildly inefficient, why are you returning the msgid when you
already know it?
do "SELECT xmlcontent FROM messages WHERE msgid = 1892362" instead.
It's not much, but you're saving cycles and memory inside of a loop.
--
Bruce Johnson
University of Arizona
College of Pharmacy
Information Technology Group
Institutions do not have opinions, merely customs