在sqlplus中处理未找到的异常

时间:2018-05-14 12:45:04

标签: oracle shell sqlplus

我试图从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

1 个答案:

答案 0 :(得分:1)

PL / SQL EXIT语句仅适用于LOOP。检查一下:EXIT Statement。它不等同于shell的exit <exitcode>或SQL * Plus'exit。因此,您的PL / SQL块根本不会编译。

此外,对于SQLCODE等异常,您无法确保Shell将捕获与Oracle no_data_found相同的退出代码。由于您已经拥有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