Има два основни модела, които можете да приложите за обработка на изключения; „погледни, преди да скочиш“ (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 работи от вътрешен блок към външен блок, така че първоначалната причина за грешката ще бъде първото изключение.