我使用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会好得多,但我更愿意找到解决上述问题的方法.非常感谢!
close() 应该告诉你你想知道什么:
如果文件句柄来自管道打开,则如果涉及的其他系统调用之一失败或其程序以非零状态退出,则close返回false.如果唯一的问题是程序退出非零,$!将被设置为0.关闭管道还会等待管道上执行的进程退出 - 如果您希望之后查看管道的输出 - 并隐式将该命令的退出状态值放入$?和$ {^ CHILD_ERROR_NATIVE}.
主要观点是,close()对于任何错误都将返回false,$!仅在系统调用出错时$?才会设置,并将设置为退出状态.有关详细信息,请参阅perlvar中的错误变量.
我没有看到 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失败的指示。
希望有帮助。