sql >> データベース >  >> RDS >> Oracle

DBMS_SCHEDULER.DROP_JOBが存在する場合のみ

    例外処理に適用できる主なパターンは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つの点に注意する価値があります。

    1. 私はのみです この特定の例外によって発生したエラーをキャッチします。 EXCEPTION WHEN OTHERSを使用して同じことを達成することは可能です。 しかし、私はに対してを強くお勧めします これを行う。

      例外を処理する場合は、それをどうするかを正確に知っておく必要があります。 OTHERSを使用して、すべてのOracle例外を適切に処理できる可能性はほとんどありません。 そうする場合は、おそらく、気付く場所にログを記録する必要があります。 Oracleの例外の回避と処理に関するガイドライン<から引用するには/ a> :

    2. Oracleの例外の伝播 内部ブロックから外部ブロックへと機能するため、エラーの元の原因が最初の例外になります。




    1. 文字列を数値に変換/エンコードする

    2. フィールド値に基づいて一意の制約を追加します

    3. すべての列名を一覧表示します

    4. 挿入された行だけを更新するトリガー