Oracle の PL/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ブロックは必ず正常終了します。