Existují dva hlavní vzory, které můžete použít pro zpracování výjimek; „dívej se, než skočíš“ (LBYL) a „je jednodušší požádat o odpuštění než o svolení“ (EAFP). Společnost LBYL doporučuje před pokusem o její zrušení zkontrolovat, zda úloha existuje. EAFP by zahrnovala pokus o zrušení úlohy a následné zachycení a ignorování této konkrétní chyby, pokud k ní dojde.
Pokud byste použili LBYL, můžete se zeptat na systémové zobrazení USER_SCHEDULER_JOBS
abyste zjistili, zda vaše práce existuje. Pokud ano, zahoďte to.
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;
U EAFP je to trochu jinak; definujte svou vlastní výjimku pojmenování interně definované výjimky a vytvoření instance s kódem chyby, který chcete zachytit. Pokud se tato chyba objeví, nedělejte nic.
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;
U této druhé metody stojí za zmínku dvě věci.
-
Jsem pouze zachycení chyby způsobené touto konkrétní výjimkou. Totéž by bylo možné dosáhnout pomocí
EXCEPTION WHEN OTHERS
ale vřele doporučuji proti dělat tohle.Pokud řešíte výjimku, měli byste přesně vědět, co s ní uděláte. Je nepravděpodobné, že budete schopni správně zpracovat každou jednotlivou výjimku Oracle pomocí
OTHERS
a pokud tak učiníte, pravděpodobně byste je měli zaznamenat někam, kde si jich všimnou. Cituji z Pokynů pro předcházení a zacházení s výjimkami společnosti Oracle : -
šíření výjimek společnosti Oracle pracuje z interního bloku na externí blok, takže původní příčina chyby bude první výjimkou.