我使用open / print来使用sqlplus执行SQL语句,如下所示:
open (PLSQL, "|sqlplus -s $db_url");
print PLSQL <<ENDSQL;
... some SQL statements ...
exit;
ENDSQL
close(PLSQL);
我的问题是如果遇到一些错误,如何捕获执行sql语句的退出代码。我认为使用DBI会好得多,但我更愿意找到解决上述问题的方法。非常感谢!
答案 0 :(得分:7)
close()
应该告诉你你想知道什么:
如果文件句柄来自管道打开,则如果其中一个其他系统调用失败或其程序以非零状态退出,则close返回false。如果唯一的问题是程序退出非零,$!将被设置为0。关闭管道还会等待管道上执行的进程退出 - 如果您希望之后查看管道的输出 - 并隐式将该命令的退出状态值放入$?和$ {^ CHILD_ERROR_NATIVE}。
要点是close()
将针对任何错误返回false,仅当系统调用有错误时才会设置$!
,并且$?
将设置为退出状态。有关详细信息,请参阅Error Variables in perlvar。
答案 1 :(得分: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
如果您可以管理,我强烈推荐使用语言库。我不能,因此将ORA-\d\d\d\d\d\d
的grep输出作为失败的指示。
希望有所帮助。
答案 2 :(得分:2)
正如您所说,使用DBI模块比使用sqlplus
进行数据库操作更好。该实用程序仅作为命令行方便,而不是用于任何主要数据库操作,并且使用该模块可以更好地控制处理您可能遇到的任何错误,这似乎是您的问题的重点
Perl本身不允许连接进程的STDIN和STDOUT。为此,您需要使用CPAN中的IPC::Open2
模块。在Bidirectional Communication with Another Process