不使用raiserrror时在错误时停止执行PL / SQL

时间:2013-06-26 19:34:24

标签: oracle plsql

请参阅此代码:

test.sh

#!/bin/bash
echo "hello!"
klsdslkdsd
echo "bye" 

当我跑步时,我得到:

hello!
/tmp/test.sh: line 3: klsdslkdsd command not found
bye

虽然存在语法错误,但执行结果为一个(毕竟是一个脚本)。

现在,如果我这样做:

testWithStop.sh

#!/bin/bash

set -e

echo "hello!"
klsdslkdsd
echo "bye" 

我明白了:

hello!
/tmp/test.sh: line 5: klsdslkdsd command not found

执行停止是因为我从每个执行的行中得到退出错误。如果退出!= 0 则中止。

我想在一组(oracle) PL / SQL (以及 SQL )代码中复制此行为。

此时,即使出现错误, Oracles数据库管理器也会正常管理错误,并且不会停止执行 SQL 。我想,当发现错误(语法或语义)时,程序会中止,但没有触及程序的逻辑(如果是这样,我将不得不改变数百个PL / SQL和是不可能的。)

我知道我可以使用 raiserror 或创建一个封装部分代码的宏匿名阻止,因此我可以检索异常。正如我所说的那样,几百个(可能是数千个)孤立的(和逻辑复杂的) PL / SQL

是不可能的。

SQL 中是否有 set -e 或者是一种优雅的方式?

修改

特别是,我通过shell脚本( bash )执行(和调用)de PL / SQL

例如, sqlbash.sh 文件:

#!/bin/bash 
sqlplus .....  <<EOF

select * from table;
sdsdsfdsf     <--- intentional error!
select * from table2;
EOF 

如果我调用脚本,我将得到语法错误,但执行继续并且不会中止。我想中止,例如,模仿退出1 的行为。

类似的东西:

#!/bin/bash 
sqlplus .....  <<EOF

select * from table;
sdsdsfdsf     <--- intentional error!
exit 1        <--- it will  abort and the script WILL FAIL at this point
select * from table2;
EOF 

我正在使用调度程序,所以,我必须看到脚本失败,而不是执行它并给了我警告。

1 个答案:

答案 0 :(得分:2)

您正在寻找WHENEVER SQLERROR和/或WHENEVER OSERROR SQL * Pus命令。除非在脚本中间发生不良事件,否则它们允许您退出。

添加类似

的内容
whenever oserror exit 1
whenever sqlerror exit 2

位于脚本的顶部,您将能够从shell脚本中判断出某些内容失败。