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