例外処理に適用できる主なパターンは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
を使用して同じことを達成することは可能です。 しかし、私はに対してを強くお勧めします これを行う。例外を処理する場合は、それをどうするかを正確に知っておく必要があります。
OTHERS
を使用して、すべてのOracle例外を適切に処理できる可能性はほとんどありません。 そうする場合は、おそらく、気付く場所にログを記録する必要があります。 Oracleの例外の回避と処理に関するガイドライン<から引用するには/ a> : -
Oracleの
例外の伝播 内部ブロックから外部ブロックへと機能するため、エラーの元の原因が最初の例外になります。