Bonjour,
je voudrais récupérer la pile d'exception (avec à chaque fois la procédure appelante, le numéro de ligne et l'erreur Oracle). J'ai essayé avec la fonction DBMS_UTILITY.FORMAT_ERROR_STACK mais je ne retrouve que la dernière erreur, et pas toute la pile (et pas de numéro de ligne etc...).
Exemple :
J'ai juste sur la sortie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 DECLARE W_OID PDIS.DIS_RECHERCHE_CRITERE.OID_CRITERE%TYPE; BEGIN SELECT OID_CRITERE INTO W_OID FROM PDIS.DIS_RECHERCHE_CRITERE; -- TABLE QUI COMPORTE PLUSIEURS LIGNES EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_STACK); END;
Il me faudrait cette information dans le WHEN OTHERS, donc dans le handler d'exception. J'ai bien essayé DBMS_UTILITY.FORMAT_CALL_STACK, mais, comme il est appelé dans le WHEN OTHERS, il me retourne la ligne où il est appelé et pas la ligne où est survenue l'erreur (logique).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2ORA-01422: l'extraction exacte ramène plus que le nombre de lignes demandé
Pourtant, cela doit être possible car quand j'utilise un outil tel que TOAD j'ai bien une pile d'erreur...
Quelqu'un sait-il comment faire?
Je propose une piste, mais attention c'est un peu compliqué :
en réalité, j'appelle une procédure dans un package qui me permet de gérer les erreurs. Cette procédure ressemble à ceci :
Dans les autres procédures du package, je fais ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 PROCEDURE onErreur (....) DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO machin ... COMMIT END;
J'appelle donc onError() dans toutes les procédures et fonctions du package pour stocker les erreurs dans une table. Mais s'il existe un moyen de mettre un "handler d'exception sur le package" pour dire à Oracle que toutes les erreurs non catchées dans les procédures doivent être envoyées à ce handler, cela me permettrait sans doute d'utiliser DBMS_UTILITY.FORMAT_CALL_STACK.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 PROCEDURE maProc (...) BEGIN EXCEPTION WHEN OTHERS THEN onError(DBMS_OUTPUT.FORMAT_ERROR_STACK); ROLLBACK; END;
Est-ce que quelqu'un sait si ceci est possible dans un PACKAGE BODY?
Partager