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

Perl dbi 运行 psql 代码

Perl DBI - 获取事务中每个语句影响的记录

Perl DBI 何时关闭准备好的语句

为啥这个 ISQL 命令不能通过 Perl 的 DBI 运行?

perl之文本文件的嵌套循环