0

このコードを参照してください:

test.sh

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

実行すると、次のようになります。

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

構文エラーがありますが、実行は 1 つになります (スクリプトです)。

今、もしそうなら:

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のみ) コードで再現したいと考えています。

この時点で、エラーが発生しても、Oracle DB Managerはエラーを適切に管理し、 SQLの実行を停止しません。エラー(構文またはセマンティック)が見つかった場合、プログラムは中止されますが、プログラムのロジック触れることはありません(そうであれば、数百の PL/SQL を変更する必要があり、不可能です)。

raiserrorを使用するか、コードの一部をカプセル化するマクロ匿名ブロックを作成して、例外を取得できることを知っています。前述したように、数百 (場合によっては数千) の分離された (そして論理的に複雑な) PL/SQLを処理することは不可能です。

SQLでset -eに相当するもの、またはそれを行うエレガントな方法はありますか?

編集:

特に、シェル スクリプト ( bash ) を介して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

をスクリプトの先頭に追加すると、シェル スクリプトから何かが失敗したことがわかります。

于 2013-06-26T20:03:22.223 に答える