ablog

不器用で落着きのない技術者のメモ

PL/SQL で例外が発生しても処理を継続させる

OraclePL/SQL で例外が発生しても処理を継続させるには、

declare
begin
	処理 ...
exception
	when others then
	例外処理 ...
end;

という具合に書いてやればよい。


例)
全ての表・索引・クラスタから未使用の領域のみを解放するPL/SQL - ablog からの抜粋。

declare
        cursor cu is select
                segment_name, segment_type from user_segments
                        where (segment_type = 'TABLE' or segment_type = 'INDEX' or segment_type = 'CLUSTER')
                        and bytes > 65536;
        sql_stmt varchar2(500);
begin
  for rec in cu loop
                declare
                begin
                        sql_stmt := 'alter '|| rec.segment_type ||' "'||rec.segment_name ||'" deallocate unused keep 1';
--                      dbms_output.put_line(sql_stmt);
                        execute immediate sql_stmt;
                exception
                        when others then
                         dbms_output.put_line(rec.segment_name||'('||rec.segment_type||'):[ '|| sqlcode||']'||sqlerrm);
                end;
  end loop;
end;
/

この場合、例えば「execute immediate sql_stmt;」で例外発生しても異常終了せず、そのままループ処理が継続される。


プロとしてのOracle PL/SQL入門 P.83-84

OTHERSハンドラを使用すると、例外処理部で例外名が指定されていないすべての例外を処理することができます。
...
OTHERSハンドラを使用するとすべての例外に対応できるため、PL/SQLブロックは必ず正常終了します。