例外処理に適用できる主なパターンは 2 つあります。「飛躍する前に見てください」(LBYL)と「許可よりも許しを求めるほうが簡単です」(EAFP)。LBYL は、ジョブを削除する前にジョブが存在するかどうかを確認することを推奨します。EAFP では、ジョブのドロップを試行し、その特定のエラーが発生した場合はそれをキャプチャして無視します。
LBYL を適用する場合は、システム ビューUSER_SCHEDULER_JOBS
にクエリを実行して、ジョブが存在するかどうかを確認できます。もしそうなら、それを落としてください。
declare
l_job_exists number;
begin
select count(*) into l_job_exists
from user_scheduler_jobs
where job_name = 'STATISTICS_COLUMNS_JOB'
;
if l_job_exists = 1 then
dbms_scheduler.drop_job(job_name => 'STATISTICS_COLUMNS_JOB');
end if;
end;
EAFP の場合は少し異なります。内部で定義された例外に名前を付け、キャッチしようとしているエラー コードでインスタンス化することにより、独自の例外を定義します。そのエラーが発生した場合は、何もしません。
declare
job_doesnt_exist EXCEPTION;
PRAGMA EXCEPTION_INIT( job_doesnt_exist, -27475 );
begin
dbms_scheduler.drop_job(job_name => 'STATISTICS_COLUMNS_JOB');
exception when job_doesnt_exist then
null;
end;
この 2 番目の方法については、2 つの点に注意する必要があります。
この特定の例外によって発生したエラーのみをキャッチしています。を使用して同じことを達成することは可能ですが、これを行うEXCEPTION WHEN OTHERS
ことは強くお勧めしません。
例外を処理する場合は、それをどうするかを正確に知っておく必要があります。を使用してすべての Oracle 例外を適切に処理できる可能性は低いです。そうする場合は、OTHERS
おそらく、それらが通知される場所にログを記録する必要があります。例外の回避と処理に関するOracleのガイドラインから引用するには:
可能であれば、OTHERS 例外ハンドラーを使用する代わりに、名前付き例外の例外ハンドラーを記述します。
Oracle の例外伝播は内部ブロックから外部ブロックに機能するため、エラーの元の原因は最初の例外になります。