Try
sth->finish()
after the
sth->execute()

i see you're catching the return values too, as in:

$rc = sth->execute()

are you actually using them for anyting? if not, i'd suggest not capturing them, because they're doing nothing but executing more instructions.



statements.  perhaps the stale sth


On Thu, 15 Dec 2005, Ryan Stille wrote:

I am working on a script that inserts records into a Progress database.
The script connects via DBI and odbc.

As I loop through each potential record to import, I query the database
for some info.  Occasionally I get errors like this:

DBD::ODBC::st execute failed: [OpenLink][ODBC][Progress Server]Stale
request handle. Request was not opened or has been closed. (1253)
(SQL-S1000)(DBD: st_execute/SQLExecute err=-1) at ./siimport.pl line
170.
DBD::ODBC::st fetchrow_array failed: (DBD: no select statement currently
executing err=-1) at ./siimport.pl line 171.
DBD::ODBC::st execute failed: [OpenLink][ODBC][Progress Server]Stale
request handle. Request was not opened or has been closed. (1253)
(SQL-S1000)(DBD: st_execute/SQLExecute err=-1) at ./siimport.pl line
170.
DBD::ODBC::st fetchrow_array failed: (DBD: no select statement currently
executing err=-1) at ./siimport.pl line 171.
DBD::ODBC::st execute failed: [OpenLink][ODBC][Progress Server]Stale
request handle. Request was not opened or has been closed. (1253)
(SQL-S1000)(DBD: st_execute/SQLExecute err=-1) at ./siimport.pl line
170.
DBD::ODBC::st fetchrow_array failed: (DBD: no select statement currently
executing err=-1) at ./siimport.pl line 171.

On some of the queries I was able to switch from:
$sth = $dbh->prepare($query);
$rc = $sth->execute();
($si_owner) = $sth->fetchrow_array();

To:
($si_owner) = $dbh->selectrow_array($query);

Which make the problem go away for some reason.  I was not able to
change all the queries to use selectrow_array of course.  But after
googling the "select statement currently executing" I came up with this:

$dbh->{odbc_exec_direct} = 1;

Which made the problem go away completely.  But I'd really like to
understand why.  I'd hate to see this problem come up again when I put
the script into production.  The blurb from the documentation was no
help:

odbc_exec_direct -
Force DBD::ODBC to use SQLExecDirect instead of SQLPrepare() then
SQLExecute. There are drivers that only support SQLExecDirect and the
DBD::ODBC do() override doesn't allow returning result sets. Therefore,
the way to do this now is to set the attributed odbc_exec_direct. There
are currently two ways to get this: $dbh->prepare($sql, {
odbc_exec_direct => 1}); and $dbh->{odbc_exec_direct} = 1; When
$dbh->prepare() is called with the attribute "ExecDirect" set to a
non-zero value dbd_st_prepare do NOT call SQLPrepare, but set the sth
flag odbc_exec_direct to 1.


Thanks for any help.
-Ryan


--
LLL         OOOO          UUU     UUU    IIII     SSSSS
LLL       OOO  OOO        UUU     UUU    IIII   SSSS
LLL      OOO    OOO       UUU     UUU    IIII  SSS
LLL     OOO      OOO      UUU     UUU    IIII SSS
LLL    OOOO      OOOO     UUU     UUU    IIII SSSSS
LLL    OOOO      OOOO     UUU     UUU    IIII   SSSSS
LLL     OOOO    OOOO      UUUUUUUUUUU    IIII     SSSSS
LLL      OOOO  OOOO        UUUUUUUUU     IIII     SSSS
LLLL      OOOOOOOO           UUUUU       IIII  SSSSSS
LLLLLLLL   OOOOOO             UUU        IIII SSSSS
LLLLLLLL

Reply via email to