DBMS_SCHEDULER.DROP_JOB seulement si il existe
J'ai un script sql que je dois courir après, j'ai importer un dump. entre autres choses, le script n', il effectue les opérations suivantes:
BEGIN
--remove program
SYS.DBMS_SCHEDULER.DROP_PROGRAM(program_name=>'STATISTICS_COLUMNS_PROG',FORCE=>TRUE);
--remove job
SYS.DBMS_SCHEDULER.DROP_JOB (job_name => 'STATISTICS_COLUMNS_JOB');
END;
Parfois le travail était déjà tombé dans le schéma d'origine, le dump est livré sans le travail et le script échoue:
ERROR at line 1:
ORA-27475: "DMP_6633.STATISTICS_SET_COLUMNS_JOB" must be a job
ORA-06512: at "SYS.DBMS_ISCHED", line 213
ORA-06512: at "SYS.DBMS_SCHEDULER", line 657
ORA-06512: at line 5
Comment puis-je éviter cet échec dans le cas où le travail n'existe pas, mais encore être en mesure de tomber si elle est?
OriginalL'auteur user2183505 | 2013-11-24
Vous devez vous connecter pour publier un commentaire.
Il existe deux principaux modèles que vous pouvez appliquer à la gestion des exceptions; "avant de faire le saut" (LBYL) et "il est plus facile de demander pardon que la permission" (l'aeap). LBYL préconise de vérifier pour voir si le travail existe avant de tenter de la faire tomber. L'aeap impliquerait la tentative de drop de l'emploi, puis en capturant et en ignorant cette erreur spécifique, si elle se produit.
Si vous étiez à appliquer LBYL vous pouvez interroger le système de vue
USER_SCHEDULER_JOBS
pour voir si votre travail existe. Si elle le fait, de le déposer.Pour l'aeap, c'est légèrement différent; définir votre propre exception par nomination d'un définies en interne exception et de son instanciation avec le code d'erreur vous êtes à la recherche pour les attraper. Si cette erreur est ensuite soulevé, ne rien faire.
Il est intéressant de noter deux choses au sujet de cette seconde méthode.
Je suis seulement attraper les erreurs soulevées par cette exception spécifique. Il serait possible de réaliser la même chose en utilisant
EXCEPTION WHEN OTHERS
mais je vous recommande fortement de contre faire.Si vous manipulez une exception, vous devez savoir exactement ce que vous allez faire avec elle. Il est peu probable que vous avez la capacité à gérer chaque Oracle exception correctement à l'aide de
OTHERS
et si vous le faites, vous devriez probablement se connecter quelque part où ils vont être remarqué. Pour citer Oracle Lignes directrices pour l'Éviter et la gestion des Exceptions:Oracle la propagation d'exception fonctionne à partir de l'intérieur de bloc à bloc externe de sorte que la cause initiale de l'erreur sera la première exception.
Merci! C'est un dimanche, plus de temps... et j'avais déjà écrit une partie de cette avant @Ian.
C'est un très bon exemple de la façon dont une réponse professionnelle ressemble! Merci pour l'excellente réponse!
Bien que cette réponse est assez vieux, je veux juste ajouter une note sur "regarder avant de sauter". Selon votre situation, vous pouvez prendre en compte que la seule chose que vous avez juste vérifié l'existence peut avoir été supprimé par un autre session, juste avant votre session atteint la suppression de la partie.
OriginalL'auteur Ben