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