Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

DBMS_SCHEDULER.DROP_JOB somente se existir


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.

  1. Eu sou apenas capturando o erro gerado por essa exceção específica. Seria possível conseguir a mesma coisa usando EXCEPTION 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 usando OTHERS 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 :

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