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

PL/SQL Oracle Discussion :

Jeter une exception d'une procédure au bloc anonyme appelant ?


Sujet :

PL/SQL Oracle

  1. #1
    Membre chevronné
    Profil pro
    MOA
    Inscrit en
    Décembre 2002
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : MOA

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 104
    Points : 2 020
    Points
    2 020
    Par défaut Jeter une exception d'une procédure au bloc anonyme appelant ?
    Hello tout le monde,


    J'ai un bloc anonyme dans un fichier .SQL appelé par SQL*Plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    begin
    @ma_procedure;
    end;
    /
    Je souhaiterai jeter une exception de la procédure ma_procedure et l'intercepter dans le bloc anonyme.

    Avec deux procédures stockées dans un même package et l'exception déclarée dans l'entête, les deux procédures reconnaissent l'exception commune, comme on peut le voir ici :
    http://www.adp-gmbh.ch/ora/plsql/exception.html

    J'ai testé à tout hasard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE OR REPLACE PROCEDURE ma_procedure IS
        CODE_RETOUR_EXCEPTION EXCEPTION;
    BEGIN
        raise CODE_RETOUR_EXCEPTION;
    EXCEPTION 
        when CODE_RETOUR_EXCEPTION then
             DBMS_OUTPUT.PUT_LINE ('code retour 1');
       when OTHERS then
             raise;
    END;
    Puis ai appelé la procédure avec mon bloc anonyme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE
        CODE_RETOUR_EXCEPTION EXCEPTION;
    BEGIN
    @ma_procedure;
    EXCEPTION
       when CODE_RETOUR_EXCEPTION then
             DBMS_OUTPUT.PUT_LINE ('code retour 2');          
       when OTHERS then
             DBMS_OUTPUT.PUT_LINE ('code retour 3');
    end;
    Mais bien sûr, donc mon bloc anonyme, je ne tombe pas dans les exceptions.
    Ce qui est normal car l'exception CODE_RETOUR_EXCEPTION n'est pas commune au bloc anonyme et à la procédure stockée

    Dans ce cas, comment faire pour jeter l'exception d'une procédure à un bloc anonyme ?

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 281
    Points
    281
    Par défaut Déclarer les exceptions communes dans un package
    Salut,

    Tu peux déclarer tes exceptions communes dans un package et les utiliser dans une procédure ou un bloc anonyme.

    Etape 1: Déclarer les exceptions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Create Or Replace Package zpoz_exc As
     
      exc_1 Exception;
    End;
    /
    Etape 2: Lever l'exception dans une procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Create Or Replace Procedure zpoz_exc_prc As
    Begin
      Raise zpoz_exc.exc_1;
    -- On pourrait aussi bien ne pas mettre de clause exception dans ce cas
    Exception
      When Others Then
        Raise;
    End;
    /
    Etape 3 : Utilisation depuis un bloc PlSql anonyme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Begin
      zmbo_exc_prc;
    Exception
      When zpoz_exc.exc_1 Then
        dbms_output.put_line('exc_1');
      When Others Then
        dbms_output.put_line('other');
    End;
    /
    Pozzo

  3. #3
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Utilisez Raise_Application_Error.
    Par ailleurs ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    Exception
      When Others Then
        Raise;
    ne sert strictement à rien à part de vous discréditer dans un interview professionnel. AskTom.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 281
    Points
    281
    Par défaut
    Il faut lire le commentaire dans le code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    -- On pourrait aussi bien ne pas mettre de clause exception dans ce cas
    La clause exception est là pour être complétée à l'image de l'exemple de départ donné par weed.

    A part ça :
    Le raise_application_error demande un numéro d'exception. On a accès à la tranche -20000 à -20999. On peut se repasser l'exception d'un programme à l'appelant si on se définit une nomenclature des erreurs en fonction des numéros. Avec 1000 exceptions différentes il y a de quoi faire. MAIS il faut savoir à quoi correspond la -20001, la -20002 etc... ET ne pas réutiliser les numéros à tord et à travers dans les programmes.

    Si l'idée est de maintenir quelque part un référentiel centralisé des exceptions qu'on puisse utiliser dans l'application le package avec des exceptions nommées en clair est intéressant.

    Pozzo

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    Tu as catché l'exception dans le code de ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE OR REPLACE PROCEDURE ma_procedure IS
        CODE_RETOUR_EXCEPTION EXCEPTION;
    BEGIN
        raise CODE_RETOUR_EXCEPTION;
    EXCEPTION 
        when CODE_RETOUR_EXCEPTION then
             DBMS_OUTPUT.PUT_LINE ('code retour 1');
       when OTHERS then
             raise;
    END;
    Si tu souhaites que l'exception CODE_RETOUR_EXCEPTION soit récupérée par l'appelant il faut mettre un "raise;" après ton dbms_output.put_line. De cette manière tu renvera l'exception vers l'appelant.

    Dans le code que j'ai recopié ci-dessus (cf ton premier post). Tu écrit un message et ne fait rien ensuite puisque tu as traité l'exception dans ta procédure ma_procedure.

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  2. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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