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 : 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;
J'ai juste sur la sortie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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;
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
 
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?