Existem dois padrões principais que você pode aplicar ao tratamento de exceções; "olhe antes de pular" (LBYL) e "é mais fácil pedir perdão do que permissão" (EAFP). A LBYL recomendaria verificar se o trabalho existe antes de tentar eliminá-lo. O EAFP envolveria a tentativa de descartar o trabalho e, em seguida, capturar e ignorar esse erro específico, se ocorrer.
Se você aplicar o LBYL, poderá consultar a visualização do sistema
USER_SCHEDULER_JOBS
para ver se o seu trabalho existe. Se isso acontecer, solte-o. 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 EAFP é um pouco diferente; defina sua própria exceção por nomear uma exceção definida internamente e instanciando-o com o código de erro que você deseja capturar. Se esse erro for gerado, não faça 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 a pena notar duas coisas sobre este segundo método.
-
Eu sou apenas capturando o erro gerado por essa exceção específica. Seria possível conseguir a mesma coisa usandoEXCEPTION WHEN OTHERS
mas eu recomendo contra Fazendo isso.
Se você lidar com uma exceção, você deve saber exatamente o que vai fazer com ela. É improvável que você tenha a capacidade de lidar com todas as exceções do Oracle corretamente usandoOTHERS
e se você fizer isso, provavelmente deve registrá-los em algum lugar onde eles sejam notados. Para citar as diretrizes para evitar e lidar com exceções da Oracle :
-
propagação de exceção da Oracle funciona de bloco interno para bloco externo, então a causa original do erro será a primeira exceção.