【问题标题】:Handle Not Found Exceptions in sqlplus在 sqlplus 中处理未找到的异常
【发布时间】:2018-05-14 12:45:04
【问题描述】:

我正在尝试从 shell 脚本调用 sqlplus 命令,然后尝试 使用退出状态检查成功/失败。但是,这在未找到的情况下不起作用。当给定输入没有删除行时,我需要获取非零的退出代码。

sqlplus -s $DB_CONNECTION << EOF
        set heading off pages 0 echo off feedback off 
        WHENEVER SQLERROR EXIT SQL.SQLCODE
        BEGIN 
        DELETE FROM config where Id_ = '1345';
         IF SQL%ROWCOUNT = 0 THEN
           RAISE NO_DATA_FOUND;
         END IF;
        EXCEPTION
        WHEN NO_DATA_FOUND THEN
          EXIT 100;
        END;
EOF

【问题讨论】:

  • 检查我的答案,如果有帮助,请接受。另请阅读:stackoverflow.com/help/someone-answers

标签: oracle shell sqlplus


【解决方案1】:

PL/SQL EXIT 语句仅在 LOOP 内有效。检查这个:EXIT Statement。它不等同于 shell 的 exit &lt;exitcode&gt; 或 SQL* Plus 的 exit。所以,你的 PL/SQL 块根本不会编译。

此外,对于像no_data_found 这样的异常,您无法确保 Shell 将捕获与 Oracle 的 SQLCODE 相同的退出代码。由于您已经拥有WHENEVER SQLERROR,您可能根本不包含EXCEPTION 块,只需检查非零退出代码。

sqlplus -s $DB_CONNECTION << EOF
        set heading off pages 0 echo off feedback off 
        WHENEVER SQLERROR EXIT SQL.SQLCODE
        BEGIN 
         DELETE FROM config where Id_ = '1345';
          IF SQL%ROWCOUNT = 0 THEN
            RAISE NO_DATA_FOUND;
          END IF;
        END;
EOF 
exit_code=$?
if [ $exit_code != 0 ]
then
  echo "No rows deleted for the given input"
fi

【讨论】:

  • 缺少END;
  • @kfinity:谢谢!
猜你喜欢
  • 2023-03-07
  • 2013-10-23
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 2022-10-22
  • 1970-01-01
  • 2021-09-12
  • 2011-11-25
相关资源
最近更新 更多