このコードを参照してください:
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
私はスケジューラを使用しているため、スクリプトが実行されて警告が表示されたことではなく、スクリプトが失敗したことを確認する必要があります。