sql >> Database >  >> RDS >> Oracle

DBMS_SCHEDULER.DROP_JOB alleen indien aanwezig

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.

  1. 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 :

  2. Oracle's uitzondering propagatie werkt van intern blok naar extern blok, dus de oorspronkelijke oorzaak van de fout is de eerste uitzondering.




  1. Rails ongedefinieerde methode voor ActiveRecord_Associations_CollectionProxy

  2. Verschil tussen waar en en clausule in join sql-query

  3. Heeft PL/SQL een StringTokenizer die gelijkwaardig is aan die van Java?

  4. Tabel wordt twee keer gespecificeerd, zowel als doel voor 'UPDATE' en als aparte bron voor gegevens in mysql