我有一个perl脚本,它使用DBI接口准备一个带有参数1,2,3,4的语句.pream语句执行一个带有4个参数的存储过程。然后它运行一个foreach循环并执行
如果参数不正确,则存储过程会抛出错误并执行失败。我有兴趣打印警告并继续下一组参数。
在"无效参数"第一次执行失败后,我得到"尝试启动新的Adaptive Server操作,结果待处理"因为SQL中的errmsg执行后续循环迭代。
foreach my $file (@filelist)
{
#.. get param1 , param2 , param3, param4 from $file
unless ( dbh->execute($param1,$param2,$param3,$param4) )
{
#print some warning
next;
}
}
如何继续处理此错误?
这些是我正在使用的版本
>perl -MDBI -e 'DBI-> installed_versions;'
Perl : 5.010001 (x86_64-linux-thread-multi)
OS : linux (2.6.18-348.12.1.el5)
DBI : 1.609
DBD::Sybase : 1.15
DBD::Sponge : 12.010002
DBD::SQLite : 1.27
DBD::Proxy : install_driver(Proxy) failed: Can't locate RPC/PlClient.pm in @INC
DBD::Informix : 2013.0521
DBD::Gofer : 0.011565
DBD::File : 0.37
DBD::ExampleP : 12.010007
DBD::DBM : 0.03
我在mekazu建议的连接中添加{ RaiseError => 0, PrintWarn => 1, PrintError => 1 }
,(代码与你的mekazu完全相同)但是它仍然没有帮助仍然得到相同的错误。
在foreach中我获得成功, 迭代1没有错误
迭代2给出了存储过程错误
"数据库执行失败。错误消息:服务器消息号= 52001 severity = 16 state = 1 line = 124 server = dev procedure = sp1 text = Data 错误:参数无效:P1
迭代3
数据库执行失败。错误消息:OpenClient消息:LAYER = (0)ORIGIN =(0)SEVERITY =(78)NUMBER =(51)服务器开发,数据库 dev消息字符串:尝试启动新的Adaptive Server 结果未决的操作
迭代4
数据库执行失败。错误消息:OpenClient消息:LAYER = (0)ORIGIN =(0)SEVERITY =(78)NUMBER =(51)服务器开发,数据库 dev消息字符串:尝试启动新的Adaptive Server 结果未决的操作
答案 0 :(得分:0)
确保在创建句柄时禁用RaiseError
(默认值:false)。您可以使用PrintWarn
(默认值:false)和PrintError
(默认值:true)来保存您自己执行此操作:
$dbh = DBI->connect($dsn, $user, $password,
{ RaiseError => 0, PrintWarn => 1, PrintError => 1 });
my $sth = $dbh->prepare($query);
foreach my $file (@filelist)
{
#.. get param1 , param2 , param3, param4 from $file
unless ( $sth->execute($param1,$param2,$param3,$param4) )
{
#warning already printed
next;
}
}