[Gestion Exceptions] Comment utiliser la pile d'exception
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 :
Code:
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; |
J'ai juste sur la sortie :
Code:
1 2
|
ORA-01422: l'extraction exacte ramène plus que le nombre de lignes demandé |
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).
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 :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
PROCEDURE onErreur (....)
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO machin ...
COMMIT
END; |
Dans les autres procédures du package, je fais ceci :
Code:
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; |
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.
Est-ce que quelqu'un sait si ceci est possible dans un PACKAGE BODY?