0

请参阅此代码:

测试.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

执行停止,因为我从每个执行的行中都收到退出错误。如果exit != 0它中止。

我想在一组(oracle)PL/SQL(和单独的SQL)代码中复制这种行为。

此时,即使出现错误,Oracles DB Manager也会优雅地管理错误并且不会停止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 

如果我调用脚本,我会得到语法错误,但执行会继续并且不会中止。例如,我想中止模仿exit 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 

我正在使用调度程序,因此,我有必要看到脚本失败,而不是它被执行并给了我警告。

4

1 回答 1

1

您正在寻找WHENEVER SQLERROR和/或WHENEVER OSERROR SQL*Pus 命令。它们允许您在脚本中间发生不好的事情时退出。

把类似的东西

whenever oserror exit 1
whenever sqlerror exit 2

在你的脚本的顶部,你就可以从你的 shell 脚本中看出有些事情失败了。

于 2013-06-26T20:03:22.223 回答