我不知道可能是什么原因,我已经在网上花了几个小时试图找出我的情况出了什么问题。
我查过官方文档 https://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12052.htm还有一些汤姆·凯特的想法 http://tkyte.blogspot.com/2010/04/new-thing-about-sqlplus.html对此并且肯定stackoverflow 上的主题 https://stackoverflow.com/questions/1402610/how-do-i-capture-a-sqlplus-exit-code-within-a-shell-script关于它。
我使用以下代码:
.. < <(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 的版本有某种关系。但我没有遇到有关此类限制的信息。
我在这里缺少什么?
如果有人可以分享任何想法,我将非常感激。
先感谢您。
考虑下面的通用片段:
$ cmd1 < <(cmd2) # Or cmd1 <(cmd2)
$ echo $?
Here, $?
设置为退出状态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 中运行,并且任何更改的环境(变量/密码)都将丢失。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)