エラーハンドリング方法
エラーハンドリングは、EXCEPTIONブロックで行う。補足する例外は、when句で指定することができて、名前付き例外を指定したりすることができる。
全ての例外を補足することを意味する「others」は、一番最後のwhen句のみに指定できる。
exception when no_data_found then -- no_data_found例外の場合 dbms_output.put_line('data not faound'); when others then -- 上記に該当しない場合 dbms_output.put_line('other error');
複数のエラーで同一のエラー処理を行う必要がある場合には、下のようにwhen句で「or」でつないで複数の例外を指定すれば良い。
下の場合だと、no_data_foundかzero_divideが発生した場合に、このwhen句のブロック内のステートメントが実行される。
when no_data_found or zero_divide then
名前付き例外の宣言
名前付き例外として定義されていない例外は、PRAGMA EXCEPTION_INITを使用して名前付き例外を定義することができる。declare hoge_error exception; pragma exception_init(hoge_error, -1843); begin raise hoge_error; exception when hoge_error then dbms_output.put_line('hoge_error'); dbms_output.put_line(sqlerrm); when others then dbms_output.put_line('other error'); dbms_output.put_line(sqlerrm); end;実行結果
hoge_errorが、when hoge_errorで補足できていることがわかる。また、ORA-01843とhoge_errorが紐付けられていることもわかる。
hoge_error ORA-01843: not a valid month PL/SQL procedure successfully completed.
名前付き例外を使わない場合は、othersで補足して分岐を書かなければならない。下のコードを見るとわかるけど、明らかに可読性が悪い。
when others then if sqlcode = -1843 then dbms_output.put_line('-1843'); return; end if;
例外に対応するメッセージの取得
sqlerrmを使用すると、例外に対応するメッセージを取得できる。sqlerrmは、exception句で使用すると発生した例外に対するメッセージを取得できる。また、任意のエラーコードを引数に指定すると、指定したコードに対するメッセージも取得することができる。
以下のプログラムで動きを見てみると。
declare begin dbms_output.put_line(sqlerrm); -- exceptionブロック意外でsqlerrmを使用 dbms_output.put_line(sqlerrm(-1)); -- 一意制約のエラーコードを指定 raise no_data_found; exception when others then dbms_output.put_line(sqlerrm); -- exceptionブロックで使用 end;
実行結果は、下のようになる。
ORA-0000: normal, successful completion -- 正常を表すメッセージが取得できる。 ORA-00001: unique constraint (.) violated -- 一意制約違反を表すメッセージ ORA-01403: no data found -- exceptionブロックで補足した例外のメッセージ