Perl DBI错误消息:无法在未定义的值上调用方法"selectcol_arrayref"

0 oracle perl dbi

my $dblinks = '';
$dblinks = $dbh->selectcol_arrayref("select db_link from db_links where ticket=\'LOW\'");
my $success = 0;
for my $dblink (@$dblinks) {
  $success = eval {
    my ($ret) = $dbh->selectrow_array("select 1 from "
      . $dbh->quote_identifier($dblink, 'SYSIBM', "SYSDUMMY1") );
    $ret;
  };

  if ($success) {
    &Logging (3, $I, "connect_${G_CONNECT_COUNT}", "Connect success for $dblink");
  } else {
    # Read thru the selectcol_array, check for an oracle error
    $l_msg="$dblink Result doesn't match 1";
    @l_errstr=();
    &ConnectFailed ($p_host, $p_db, $p_ars, $p_ars_sev, $l_msg, $p_cid, @l_errstr);
    # Raise a Ticket with Oracle message
    &Logging (3, $I, "connect_${G_CONNECT_COUNT}", "Connect failed for $dblink");

  }
    $l_dbh->commit();
    $l_dbh->do(qq{alter session close database link  "$dblink"});

}
Run Code Online (Sandbox Code Playgroud)

Sin*_*nür 5

更新:

很简单,实际上,您分配了connect调用返回的句柄,$l_dbh但是调用了一个方法$dbh.你必须使用严格.

原始答案:

$dbh未定义数据库句柄,这意味着连接失败.您应该检查呼叫的返回值,或者{ RaiseError => 1}connect呼叫中指定以找出原因.

此外,没有理由为每个子调用添加前缀&:使用ConnectFailed( )而不是&ConnectFailed( ),除非您知道为子调用添加前缀&并希望产生该效果的效果.

来自perldoc perlsub:

可以使用显式&前缀调用子例程.该& 是在现代的Perl可选的,因为有括号,如果子程序已预先声明.在& 当刚刚命名的子程序,当它被用来作为一个参数,如不可选defined()undef().当你想用子程序名称或使用&$subref()&{$subref}() 构造的引用进行间接子程序调用时,它也不是可选的,尽管$subref->()符号解决了这个问题.

...如果使用& 表单调用子例程,则参数列表是可选的,如果省略,则不@_ 为子例程设置@_数组:调用时的数组对子例程可见.这是新用户可能希望避免的效率机制.(重点补充).