sqlplus WHENEVER SQLERROR を検証
id:yohei-a に WHENEVER SQLERROR について聞いたので試してみました
sqlplus内で起きたsqlエラーをどのように処理するか(exit or continue)とか
エラー時にトランザクションをどうするか(commit or rollback )
を指定できます。
まともにsqlplus使うつもりならとても有用ですね。
↓オラクルのマニュアル
http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05784-01/ch12052.htm
今回試したのは WEHNEVER SQLERROR EXIT です
まずこんなshellをつくって
#!/bin/sh sqlplus -s user/pass @./test.sql > /dev/null ret=$? echo $ret
で、test.sqlを書き換えながら下記のパターンを試してみました
set serverout on size 10000 set linesize 1000 WHENEVER SQLERROR EXIT SUCCESS select count(*) from d; EXIT 123
結果:0
set serverout on size 10000 set linesize 1000 WHENEVER SQLERROR EXIT FAILURE select count(*) from d; EXIT 123
結果:1
set serverout on size 10000 set linesize 1000 WHENEVER SQLERROR EXIT WARNING select count(*) from d; EXIT 123
結果:2
set serverout on size 10000 set linesize 1000 WHENEVER SQLERROR EXIT 9999 select count(*) from d; EXIT 123
結果:15
??
戻り値は8bitまでなので255までとなる、それ以上いくとまた0から開始。。。
select mod(9999,256) from dual;
=15
set serverout on size 10000 set linesize 1000 VARIABLE test_error_code NUMBER BEGIN :test_error_code := 111; END; / WHENEVER SQLERROR EXIT :test_error_code select count(*) from d; EXIT 123
結果:111
set serverout on size 10000 set linesize 1000 WHENEVER SQLERROR SQL.SQLCODE select count(*) from d; EXIT 123
結果:174
ORA-00942: table or view does not exist のエラーが出るはずなので
select mod(942,256) from dual;
=174