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

时间:2012-09-04 12:28:10

标签: perl

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

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

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

3 个答案:

答案 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

中了解问题