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