Perl 执行 DBI 循环执行
Posted
技术标签:
【中文标题】Perl 执行 DBI 循环执行【英文标题】:Perl Executing DBI execute in Loop 【发布时间】:2016-10-31 13:45:16 【问题描述】:我有一个 perl 脚本,它使用 DBI 接口准备一个带有参数 1、2、3、4 的语句。prepare 语句执行一个带有 4 个参数的存储过程。然后它运行一个 foreach 循环并执行
如果参数不正确,存储过程会抛出错误并执行失败。我有兴趣打印警告并继续下一组参数。
在“无效参数”第一次执行失败后,在 SQL 执行后续循环迭代时,我得到“尝试启动新的 Adaptive Server 操作,结果未决”作为 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 严重性=16 状态=1 行=124 服务器=开发程序=sp1 文本=数据 错误:无效参数:P1
第三次迭代
数据库执行失败。错误消息: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 有结果的操作
【问题讨论】:
您是否尝试过将您的$dbh->execute($p1,$p2$"p3,$p4)
与eval $dbh->execute(...); or do #print some warning; next;
联系起来?
我收到同样的错误 - 数据库执行失败。错误消息:OpenClient 消息:LAYER = (0) ORIGIN = (0) SEVERITY = (78) NUMBER = (51) Server dev, database dev 消息字符串:尝试启动新的 Adaptive Server 操作,结果未决
如何清除此错误。我不清楚这是 DBI 还是 SQL 错误
看起来该错误来自 SQL 服务器。您知道它在您的程序中的哪个位置发布吗?您的代码没有通过 DBI 进行任何错误处理。 DBI 可能会在execute
内部做些什么吗?错误消息中是否有任何 at foo.pm line 123 您没有显示的内容?添加带有您正在访问的存储过程和/或表的CREATE
的示例 DDL,以及您准备创建此错误的语句以及准备的 Perl 代码会有所帮助。您可以在edit 的问题中添加minimal reproducible example。
什么DBI版本,什么DBD驱动和版本?这个error message suggests an old bug in the DBD::Sybase driver, fixed long ago.
【参考方案1】:
确保在创建句柄时禁用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;
【讨论】:
以上是关于Perl 执行 DBI 循环执行的主要内容,如果未能解决你的问题,请参考以下文章
执行yum list installed | grep xxx 命令时报错:未提供依赖perl-DBD-SQLiteperl-DBI