IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

[Gestion Exceptions] Comment utiliser la pile d'exception


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 15
    Points : 10
    Points
    10
    Par défaut [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 : 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?

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    peut-être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Merci!

    Je ne trouve pas cette fonction (erreur : "PLS-00302: Le composant 'FORMAT_ERROR_BACKTRACE' doit être déclaré").

    Je n'en trouve pas non plus mention dans la documentation Oracle 9...

    Faut-il installer un composant particulier au niveau de la base pour y avoir accès, ou bien n'est-elle accessible qu'en Oracle 10?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Après vérification, effectivement cette fonction n'existe qu'en Oracle 10G. Est-ce que quelqu'un sait comment on peut faire la même chose en Oracle 9? (Ca doit être possible car TOAD affiche la pile des erreurs en cas d'exception non catchée...)

  5. #5
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Et dbms_utility.format_call_stack ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Ca me retourne la pile d'appel, donc si je l'appelle dans le WHEN OTHERS, il me retourne la ligne du WHEN OTHERS et pas la ligne où l'erreur survient.

    Pour s'en convaincre on peut essayer le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    DECLARE
     
    TOTO CHAR(1);
     
    BEGIN
     
    SELECT TO_NUMBER('A') INTO TOTO FROM DUAL;
     
    EXCEPTION
     
    WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_CALL_STACK);
     
    END;
    on retourne bien la ligne 11 dans le stack :-(

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/12/2011, 12h39
  2. [Gestion des Exceptions] Comment faire ?
    Par caballero dans le forum Services Web
    Réponses: 3
    Dernier message: 21/02/2008, 09h39
  3. Comment utiliser (try..except) ?
    Par moukah2 dans le forum Débuter
    Réponses: 3
    Dernier message: 21/12/2007, 12h03
  4. Réponses: 2
    Dernier message: 28/08/2003, 00h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo