Oracle
 sql >> Base de données >  >> RDS >> Oracle

DBMS_SCHEDULER.DROP_JOB uniquement s'il existe

Il existe deux modèles principaux que vous pouvez appliquer à la gestion des exceptions ; « regarde avant de sauter » (LBYL) et « il est plus facile de demander pardon que la permission » (EAFP). LBYL préconiserait de vérifier si le travail existe avant de tenter de le supprimer. EAFP impliquerait de tenter de supprimer le travail, puis de capturer et d'ignorer cette erreur spécifique, si elle se produit.

Si vous deviez appliquer LBYL, vous pouvez interroger la vue système USER_SCHEDULER_JOBS pour voir si votre travail existe. Si c'est le cas, laissez tomber.

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;

Pour l'EAFP, c'est légèrement différent; définissez votre propre exception en nommant une exception définie en interne et en l'instanciant avec le code d'erreur que vous cherchez à attraper. Si cette erreur se produit alors, ne faites rien.

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;

Il convient de noter deux choses à propos de cette seconde méthode.

  1. Je suis seulement intercepter l'erreur générée par cette exception spécifique. Il serait possible d'obtenir la même chose en utilisant EXCEPTION WHEN OTHERS mais je déconseille fortement contre Ce faisant.

    Si vous gérez une exception, vous devez savoir exactement ce que vous allez en faire. Il est peu probable que vous ayez la capacité de gérer correctement chaque exception Oracle en utilisant OTHERS et si vous le faites, vous devriez probablement les enregistrer quelque part où ils seront remarqués. Pour citer les Directives pour éviter et gérer les exceptions :

  2. propagation des exceptions d'Oracle fonctionne d'un bloc interne à un bloc externe, de sorte que la cause d'origine de l'erreur sera la première exception.