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

SQL Oracle Discussion :

Gérer des exceptions en dehors des procédures ? [11g]


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut Gérer des exceptions en dehors des procédures ?
    Bonjour,

    Je souhaite savoir s'il est possible de gérer les exceptions se déclenchant dans les procédures à l'extérieur des procédures.

    Un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    BEGIN
     maProc1;
     maProc2; => levée d une exception -00942 par exemple, une table appelée n existe pas
     Ici je souhaite faire : si exception -00942 alors gestion de l exception
    END;
    Après je ne sais si "dans les règles de l'art" c'est une bonne idée...

    En vous remerciant,

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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
    16
    17
    18
    19
    20
    DECLARE
    v NUMBER;
    Exc_Table_inexistante EXCEPTION;
    PRAGMA  EXCEPTION_INIT(Exc_Table_inexistante, -942);
     PROCEDURE Maproc1 IS 
     BEGIN
     	EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL' INTO v;
      DBMS_OUTPUT.PUT_LINE('proc1:'|| v);
     END;
     PROCEDURE Maproc2 IS 
     BEGIN
     	EXECUTE IMMEDIATE 'SELECT 1 FROM MAUVAISE_TABLE' INTO v;
      DBMS_OUTPUT.PUT_LINE('proc2:'|| v);
     END;
    BEGIN
    	Maproc1;
      Maproc2;
    EXCEPTION WHEN Exc_Table_inexistante 
    THEN DBMS_OUTPUT.PUT_LINE('Exception Exc_Table_inexistante gérée manuellement');
    END;
    Résultat du DBMS
    proc1:1
    Exception Exc_Table_inexistante gérée manuellement
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Bonjour, merci de la réponse et d'avoir pris le temps de fournir un exemple

    On utilise donc le PRAGMA qui va catcher parmi les procédure appelées une SQL_ERROR -942. Par contre si je comprends bien c'est géré de manière globale, il n'est pas possible de faire référence spécifiquement au sein du bloc global à une exception qui aurait été levée dans la définition d'une des 2 procédures.

    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
    16
    17
    18
    19
    20
    21
    DECLARE
    v NUMBER;
     PROCEDURE Maproc1 IS 
     BEGIN
     	EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL' INTO v;
      DBMS_OUTPUT.PUT_LINE('proc1:'|| v);
     END;
     PROCEDURE Maproc2 IS 
     exception mExc;
     PRAGMA EXCEPTION_INIT(mExc, -942);
     BEGIN
     	EXECUTE IMMEDIATE 'SELECT 1 FROM MAUVAISE_TABLE' INTO v;
            EXCEPTION WHEN Exc_Table_inexistante 
            THEN DBMS_OUTPUT.PUT_LINE('Exception Exc_Table_inexistante dans Proc2');
     END;
    BEGIN
    	Maproc1;
      Maproc2;
    ==> ici catcher spécifiquement l'exception liée au bloc de MaProc2
    END;

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Je ne comprends pas bien ta demande, mais tu peux le gérer comme tu veux dans chaque bloc d'exception :
    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
    16
    17
    18
    19
    20
    21
    22
    DECLARE
    v NUMBER;
    Exc_Table_inexistante EXCEPTION;
    PRAGMA  EXCEPTION_INIT(Exc_Table_inexistante, -942);
     PROCEDURE Maproc1 IS 
     BEGIN
     	EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL' INTO v;
      DBMS_OUTPUT.PUT_LINE('proc1:'|| v);
     END;
     PROCEDURE Maproc2 IS 
     BEGIN
     	EXECUTE IMMEDIATE 'SELECT 1 FROM MAUVAISE_TABLE' INTO v;
      DBMS_OUTPUT.PUT_LINE('proc2:'|| v);
     END;
    BEGIN
      Maproc1;
      BEGIN
        Maproc2;
      EXCEPTION WHEN Exc_Table_inexistante 
      THEN DBMS_OUTPUT.PUT_LINE('Exception MaProc2 Exc_Table_inexistante gérée manuellement');
      END;
    END;
    Le fait d'associer un n° d'erreur à une exception avec Pragma donne la même chose qu'un WHEN NO_DATA_FOUND ou autres, ce sont juste des exceptions prédéfinies.
    Dans ton exemple, tu ne peux pas catcher l'exception de Maproc2 car elle est traitée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    EXCEPTION WHEN Exc_Table_inexistante 
    THEN DBMS_OUTPUT.PUT_LINE('Exception Exc_Table_inexistante dans Proc2');
    END;
    Si tu veux récupérer l'erreur, soit tu passes par un paramètre OUT de procédure, soit tu RAISE pour continuer à propager l'erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    EXCEPTION WHEN Exc_Table_inexistante 
    THEN DBMS_OUTPUT.PUT_LINE('Exception Exc_Table_inexistante dans Proc2');
    RAISE;
    END;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    C'est ce que je voulais faire, je n'avais pas pensé à isoler la capture de l'exception dans un sous-bloc pour localiser la proc

    Merci pour les réponses et bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/01/2012, 15h28
  2. Gestion des exceptions imbriquée dans des Try et boucle
    Par Droïde Système7 dans le forum Débuter
    Réponses: 7
    Dernier message: 13/01/2010, 18h30
  3. Positionner des jar en dehors des war
    Par aperrin dans le forum Développement Web en Java
    Réponses: 5
    Dernier message: 30/05/2008, 15h52
  4. [POO] Gérer les erreurs MySQL par des exceptions
    Par thepooh dans le forum Langage
    Réponses: 2
    Dernier message: 04/04/2008, 11h16
  5. [Exception] Impact réel des exceptions
    Par Nasky dans le forum Général Java
    Réponses: 3
    Dernier message: 22/08/2005, 12h51

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