我不知道可能是什么原因,我花了几个小时在网上试图弄清楚我的情况有什么问题。 我已经检查过official documentation和一些thought from Tom Kyte,肯定会topic on stackoverflow关于它。
我使用以下代码:
.. < <(sqlplus -s /nolog <<EOF
set errorlogging on
WHENEVER OSERROR EXIT FAILURE
WHENEVER SQLERROR EXIT FAILURE
connect ${use}/${pwd}@${database}
@$SCRIPTS_PATH/script.sql
EOF
)
echo Exited with $?
我已经模拟了不同的故障情况,例如:
但这个人一直都会得到同样的结果:
Exited with 0
我尝试过不同的方式,例如
WHENEVER SQLERROR EXIT SQL.SQLCODE
WHENEVER SQLERROR EXIT FAILURE
等等,但都没有奏效。
互联网上的大多数人都认为这对他们有用。 所以我在这里感到困惑......
可能这个功能与我的SQL * Plus / Oracle / shell / Unix的版本有某种关联。但我没有遇到有关此类限制的信息。
我在这里缺少什么?
如果有人可以分享任何想法,我将非常感激。 提前谢谢。
答案 0 :(得分:1)
请考虑以下通用代码段:
$ cmd1 < <(cmd2) # Or cmd1 <(cmd2)
$ echo $?
此处,$?
设置为cmd1
的退出状态。 cmd2
的退出状态已丢失。
在您的情况下,sqlplus
恰好是cmd2。因此,$?
中未捕获该命令的退出状态。
你可以试试这个;
$ sqlplus ... | cmd1
$ status=(${PIPESTATUS[@]})
$ for i in ${status[@]}; do
> [ $i -ne 0 ] && echo Exited with $i
> done
$ echo Exited with 0
请注意,如果cmd1
是一个复杂的结构(例如while read
),那么您在while循环中运行的任何内容都将在子shell和&amp;任何环境(变量/密码)都会丢失。