2015-01-07 35 views
2

好吧,我已经解决了,反正我不知道为什么它的工作...:PMySQL的“命令不同步”

我的第一个代码是:

my ($sth,$rc); 
eval{ 
    $sth = $dbh->prepare('CALL mysp(?,?)'); 
    $rc = $sth->execute(1,2); 
    if ($rc eq '1'){# ok} 
}; 

if([email protected]){ 
    $dbh->rollback; 
    warn [email protected]; 
}else{ 
    $dbh->commit; 
} 

它停止与MySQL错误“命令不同步”对犯下

eval{ 
    my $sth = $dbh->prepare('CALL mysp(?,?)'); 
    my $rc = $sth->execute(1,2); 
    if($rc eq '1'){# ok} 
}; 

if([email protected]){ 
    $dbh->rollback; 
    warn [email protected]; 
}else{ 
    $dbh->commit; 
} 

本地化$sth$rceval{}它的工作原理之后......为什么?

+3

'$ sth'添加的隐式'$ sth-> finish'超出范围??? – ikegami

+1

看起来很像[DBI begin_work不能用于存储过程调用](http://stackoverflow.com/q/6454840)中描述的问题。 [pilcrow's answer](http://stackoverflow.com/a/10001508/176646)是在提交事务之前显式调用'$ sth-> finish()'(与@ikegami所说的一样)。 – ThisSuitIsBlackNot

回答

0

ikegami的回答是正确的。

您需要调用$ sth-> finish(),这是隐式完成的,因为它超出了eval {}块的范围。