使用open/print执行SQL语句时如何捕获退出代码?

Oru*_*ner 6 perl

我使用open/print来使用sqlplus执行SQL语句,如下所示:

open (PLSQL, "|sqlplus -s $db_url");
print PLSQL <<ENDSQL;
... some SQL statements ...
exit;
ENDSQL
close(PLSQL);
Run Code Online (Sandbox Code Playgroud)

我的问题是如果遇到一些错误,如何捕获执行sql语句的退出代码.我认为使用DBI会好得多,但我更愿意找到解决上述问题的方法.非常感谢!

Ven*_*tsu 7

close() 应该告诉你你想知道什么:

如果文件句柄来自管道打开,则如果涉及的其他系统调用之一失败或其程序以非零状态退出,则close返回false.如果唯一的问题是程序退出非零,$!将被设置为0.关闭管道还会等待管道上执行的进程退出 - 如果您希望之后查看管道的输出 - 并隐式将该命令的退出状态值放入$?和$ {^ CHILD_ERROR_NATIVE}.

主要观点是,close()对于任何错误都将返回false,$!仅在系统调用出错时$?才会设置,并将设置为退出状态.有关详细信息,请参阅perlvar中的错误变量.

  • @AdamKatz在我链接的错误变量文档中,它列出了如何查找`$?`的各种内容:"因此,子进程的退出值实际上是`($?>> 8)`和`$?&127 `给出了进程死亡的信号,如果有的话,`$?&128`报告是否存在核心转储." 位移(`>>`)通常优于除法,因为它通常更快,并且总是产生整数结果. (2认同)

Sam*_*Sam 2

我没有看到 SQLPlus 为 SQL 语句返回正确的退出代码,只看到连接或身份验证失败之类的情况。

echo "SELECT * FROM NO_EXIST;" | sqlplus64 -S  USER/PASS@my.db/MYAPP ; echo $?
SELECT * FROM NO_EXIST
           *
ERROR at line 1:
ORA-00942: table or view does not exist


0
Run Code Online (Sandbox Code Playgroud)

如果你能管理的话,我强烈推荐一个语言库。我不能,grep 输出也会作为ORA-\d\d\d\d\d\d失败的指示。

希望有帮助。