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)
很简单,实际上,您分配了connect调用返回的句柄,$l_dbh但是调用了一个方法$dbh.你必须使用严格.
$dbh未定义数据库句柄,这意味着连接失败.您应该检查呼叫的返回值,或者{ RaiseError => 1}在connect呼叫中指定以找出原因.
此外,没有理由为每个子调用添加前缀&:使用ConnectFailed( )而不是&ConnectFailed( ),除非您知道为子调用添加前缀&并希望产生该效果的效果.
可以使用显式
&前缀调用子例程.该&是在现代的Perl可选的,因为有括号,如果子程序已预先声明.在&当刚刚命名的子程序,当它被用来作为一个参数,如不可选defined()或undef().当你想用子程序名称或使用&$subref()或&{$subref}()构造的引用进行间接子程序调用时,它也不是可选的,尽管$subref->()符号解决了这个问题....如果使用
&表单调用子例程,则参数列表是可选的,如果省略,则不@_为子例程设置@_数组:调用时的数组对子例程可见.这是新用户可能希望避免的效率机制.(重点补充).