Oracle
 sql >> Datenbank >  >> RDS >> Oracle

DBMS_SCHEDULER.DROP_JOB nur falls vorhanden

Es gibt zwei Hauptmuster, die Sie auf die Ausnahmebehandlung anwenden können; „Schau, bevor du springst“ (LBYL) und „Es ist einfacher, um Vergebung als um Erlaubnis zu bitten“ (EAFP). LBYL empfiehlt, zu prüfen, ob der Job existiert, bevor versucht wird, ihn zu löschen. EAFP würde den Versuch beinhalten, den Job zu löschen und dann diesen spezifischen Fehler zu erfassen und zu ignorieren, falls er auftritt.

Wenn Sie LBYL anwenden würden, können Sie die Systemansicht abfragen USER_SCHEDULER_JOBS um zu sehen, ob Ihr Job existiert. Wenn ja, lassen Sie es fallen.

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;

Für EAFP ist es etwas anders; definieren Sie Ihre eigene Ausnahme durch Benennung einer intern definierten Ausnahme und es mit dem Fehlercode instanziieren, den Sie abfangen möchten. Wenn dieser Fehler dann ausgelöst wird, tun Sie nichts.

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;

Bei dieser zweiten Methode sind zwei Dinge zu beachten.

  1. Ich bin nur Abfangen des Fehlers, der durch diese spezielle Ausnahme ausgelöst wird. Es wäre möglich, dasselbe mit EXCEPTION WHEN OTHERS zu erreichen aber ich würde dagegen wärmstens empfehlen Dies tun.

    Wenn Sie eine Ausnahme behandeln, sollten Sie genau wissen, was Sie damit tun werden. Es ist unwahrscheinlich, dass Sie in der Lage sind, jede einzelne Oracle-Ausnahme mit OTHERS richtig zu behandeln und wenn Sie dies tun, sollten Sie sie wahrscheinlich irgendwo protokollieren, wo sie bemerkt werden. Um aus den Richtlinien zur Vermeidung und Behandlung von Ausnahmen :

  2. Oracles Ausnahmeweitergabe arbeitet von internem Block zu externem Block, so dass die ursprüngliche Fehlerursache die erste Ausnahme sein wird.