什么是SQLERROR永远不会工作

时间:2016-06-14 23:56:18

标签: oracle bash error-handling sqlplus whenever

我不知道可能是什么原因,我花了几个小时在网上试图弄清楚我的情况有什么问题。 我已经检查过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 $?

我已经模拟了不同的故障情况,例如:

  • 使用了错误的用户名
  • 在sql squery中发生语法错误

但这个人一直都会得到同样的结果:

Exited with 0

我尝试过不同的方式,例如

WHENEVER SQLERROR EXIT SQL.SQLCODE
WHENEVER SQLERROR EXIT FAILURE 

等等,但都没有奏效。

互联网上的大多数人都认为这对他们有用。 所以我在这里感到困惑......

可能这个功能与我的SQL * Plus / Oracle / shell / Unix的版本有某种关联。但我没有遇到有关此类限制的信息。

我在这里缺少什么?

如果有人可以分享任何想法,我将非常感激。 提前谢谢。

1 个答案:

答案 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;任何环境(变量/密码)都会丢失。

相关问题