Има два основни модела, които можете да приложите за обработка на изключения; „погледни, преди да скочиш“ (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;
Струва си да се отбележат две неща относно този втори метод.
-
Аз съм само улавяне на грешката, предизвикана от това конкретно изключение. Би било възможно да се постигне същото с помощта на
EXCEPTION WHEN OTHERSно силно препоръчвам срещу правейки това.Ако обработвате изключение, трябва да знаете точно какво ще правите с него. Малко вероятно е да имате способността да обработвате правилно всяко отделно изключение на Oracle, като използвате
OTHERSи ако го направите, вероятно трябва да ги регистрирате някъде, където ще бъдат забелязани. За да цитирам насоки на Oracle за избягване и обработка на изключения : -
разпространение на изключения на Oracle работи от вътрешен блок към външен блок, така че първоначалната причина за грешката ще бъде първото изключение.