连接到perl脚本中的多个数据库

时间:2012-03-07 18:44:16

标签: perl

如果无法连接到一个数据库,如何连接到perl中的多个数据库?如果我在一个数组中有数据库名称并在循环中通过它们,我想尝试连接并执行查询并断开连接。我将把它报告给我们的大哥服务器监控页面。如果脚本无法连接到脚本,我不希望脚本终止,因为它显然需要检查数组中的每个脚本。现在我使用DBI模块状态方法,但我不知道它是否正常工作。谢谢大家的时间!

3 个答案:

答案 0 :(得分:1)

我们能看到代码吗?我不认为对DBI->connect()的调用将会死亡,除非你明确告诉它,如:

DBI->connect($dsn, $user, $pass) or die "Can't connect: $DBI::errstr\n";

我很确定即使使用{RaiseError => 1}不会让它自动死亡。所以,如果你打电话给or die...,就不要这样做!

编辑:

考虑到@squiguy发布的代码,我会这样做:

foreach my $host (@hosts) { 
    $dbh = DBI->connect("dbi:Oracle:; host=$host; port=$port", $username, $password); 
    next unless $dbh;
    if ($dbh->state()) {
        # Do stuff with state information
    }
}

答案 1 :(得分:0)

您应该在Perl中查找异常处理。我不使用Perl所以我不知道异常处理的语法,应该很容易在线查​​找。

答案 2 :(得分:0)

  

我在一个数组中有数据库名称,然后循环播放它们,我想尝试连接并执行查询并断开连接。

如果您正在循环,则没有理由打开多个数据库。在你的循环中,打开一个数据库,做你的东西,然后关闭。

  

如果无法连接到一个数据库,如何连接到perl中的多个数据库?

我假设这是在你的循环中。每当您执行任何可能出错的Perl命令并停止执行程序时,您始终可以使用eval

你做这样的事情:

for my $database (@database_list)  {
   my $dbh;
   eval {
       $dbh = DBI->connect($database, $user, $password);
   };
   if (not $@) {
        yadda, yadda, yadda
   }
}

eval将捕获任何类型的普通致命错误。如果$@有值,则调用失败,eval返回错误说明。如果$@为空,则没有错误,您只需继续。

HOWEVER ,默认情况下,如果无法连接,DBI不会自动死亡。相反,它只返回一个未定义的值。您应该能够使用它来确定您是否已成功,或者需要转到下一个数据库:

           for my $database (@database_list)  {
   my $dbh = DBI->connect($database, $user, $password);
   if ($dbh) {
        yadda, yadda, yadda
   }
}

如果我没记错的话,有一个名为RaiseError的属性如果设置将导致程序在失败的DBI调用中死亡。但是,默认值不应设置,因此您不应该遇到任何问题。