Perl执行DBI在循环中执行

时间:2016-06-29 02:58:39

标签: sql-server perl dbi

我有一个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   结果未决的操作

1 个答案:

答案 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;
  }
}