mysql - DBI begin_work 不适用于存储过程调用

标签 mysql perl stored-procedures dbi autocommit

我正在尝试以简化形式从事务中调用存储过程:

my $dbh= DBI->connect(............  );  

my $sth = $dbh->prepare("call sp_get_workitems (1,1)");
$dbh->begin_work  or die $dbh->errstr;
$sth->execute();
my ($result)= $sth->fetchrow_array();

$dbh->commit;

这会产生以下错误:

DBD driver has not implemented the AutoCommit attribute

如果我将 begin_work 语句替换为 $dbh->{'AutoCommit'} = 0; (在准备之前或之后),我会收到此错误:

DBD::mysql::db commit failed: Commands out of sync; you can't run this command now

如果我用简单的 select 语句替换存储过程调用,一切都会正常工作。

存储过程包括许多更新并以 select 语句结束。 当然,如果我可以在发生回滚时需要执行一些 Perl 代码的过程中处理事务,那就更容易了。

我在 Windows 7 上使用 ActivePerl,在运行 Centos 且安装了 DBI 1.616 的亚马逊云实例上使用,这两种情况都会发生。

这应该有效还是有解决办法?

谢谢

最佳答案

确保在显式 commit() 事务之前显式地 finish() 每个执行的准备过程 CALL。例如,

$sth->finish;
$sth->commit();

考虑到 finish() 的典型语义,这对我来说似乎是一个错误。多个结果集、调用 more_results 等并不重要。

DBD 1.616、DBD::mysql 4.020 和 MySQL 5.5.19。

关于mysql - DBI begin_work 不适用于存储过程调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6454840/

相关文章:

SQL Server 快进游标

nhibernate - 流畅的 NHibernate 和存储过程

sql - 在 SQL 中插入不应该包含 null 的记录

php - 计算列中的 'most selected value'

java - 组合使用 MySQL 和 BoneCP 时 jdbc executeBatch 挂起

perl - 即使在 PATH 上也检查文件是否存在

php - 使用php将excel表上传到mysql

perl - 这个 CPAN 错误是什么意思?

perl - 在 Perl 中,如何导入示例 CSV,进行基本的文本操作,然后将其保存回 CSV?

mysql - 返回计算结果集的存储过程