请参阅此代码:
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
我正在使用调度程序,所以,我必须看到脚本失败,而不是执行它并给了我警告。
答案 0 :(得分:2)
您正在寻找WHENEVER SQLERROR和/或WHENEVER OSERROR SQL * Pus命令。除非在脚本中间发生不良事件,否则它们允许您退出。
添加类似
的内容whenever oserror exit 1
whenever sqlerror exit 2
位于脚本的顶部,您将能够从shell脚本中判断出某些内容失败。