sql >> Base de Datos >  >> RDS >> Oracle

DBMS_SCHEDULER.DROP_JOB solo si existe

Hay dos patrones principales que puede aplicar al manejo de excepciones; "mira antes de saltar" (LBYL) y "es más fácil pedir perdón que permiso" (EAFP). LBYL recomendaría verificar si el trabajo existe antes de intentar descartarlo. EAFP implicaría intentar descartar el trabajo y luego capturar e ignorar ese error específico, si ocurre.

Si tuviera que aplicar LBYL, puede consultar la vista del sistema USER_SCHEDULER_JOBS para ver si tu trabajo existe. Si es así, suéltalo.

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;

Para la EAFP es un poco diferente; defina su propia excepción por nombrar una excepción definida internamente e instanciarlo con el código de error que desea capturar. Si luego aparece ese error, no haga nada.

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;

Vale la pena señalar dos cosas sobre este segundo método.

  1. Soy solo capturando el error generado por esta excepción específica. Sería posible lograr lo mismo usando EXCEPTION WHEN OTHERS pero recomendaría encarecidamente contra haciendo esto.

    Si maneja una excepción, debe saber exactamente lo que va a hacer con ella. Es poco probable que tenga la capacidad de manejar cada excepción de Oracle correctamente usando OTHERS y si lo hace, probablemente debería registrarlos en algún lugar donde se noten. Para citar de las Pautas para evitar y manejar excepciones :

  2. propagación de excepciones de Oracle funciona de bloque interno a bloque externo, por lo que la causa original del error será la primera excepción.