Er zijn twee hoofdpatronen die u kunt toepassen op het afhandelen van uitzonderingen; "kijk voordat je springt" (LBYL) en "het is gemakkelijker om vergeving te vragen dan toestemming" (EAFP). LBYL pleit ervoor om te controleren of de taak bestaat voordat deze wordt verwijderd. EAFP houdt in dat wordt geprobeerd de taak te laten vallen en vervolgens die specifieke fout vast te leggen en te negeren, als deze zich voordoet.
Als u LBYL zou toepassen, kunt u de systeemweergave opvragen USER_SCHEDULER_JOBS
om te zien of uw baan bestaat. Als dit het geval is, laat het dan vallen.
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;
Voor EAFP is het iets anders; definieer uw eigen uitzondering door een intern gedefinieerde uitzondering te noemen en het instantiëren met de foutcode die u wilt opvangen. Als die fout vervolgens wordt gemeld, doe dan niets.
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;
Het is de moeite waard om twee dingen op te merken over deze tweede methode.
-
Ik ben alleen het opvangen van de fout die door deze specifieke uitzondering wordt veroorzaakt. Het zou mogelijk zijn om hetzelfde te bereiken met
EXCEPTION WHEN OTHERS
maar ik zou het ten zeerste aanbevelen tegen dit doen.Als je een exception afhandelt, moet je precies weten wat je ermee gaat doen. Het is onwaarschijnlijk dat u elke afzonderlijke Oracle-uitzondering correct kunt afhandelen met behulp van
OTHERS
en als je dat doet, zou je ze waarschijnlijk ergens moeten loggen waar ze opgemerkt zullen worden. Om te citeren uit Oracle's Richtlijnen voor het vermijden en afhandelen van uitzonderingen : -
Oracle's uitzondering propagatie werkt van intern blok naar extern blok, dus de oorspronkelijke oorzaak van de fout is de eerste uitzondering.