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.
-
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: -
Oracles Ausnahmeweitergabe arbeitet von internem Block zu externem Block, so dass die ursprüngliche Fehlerursache die erste Ausnahme sein wird.