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