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 :

[oracle 8i] [PL/SQL] Pb sur exception


Sujet :

Oracle

  1. #1
    Membre régulier Avatar de Titouf
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 177
    Points : 95
    Points
    95
    Par défaut [oracle 8i] [PL/SQL] Pb sur exception
    Bonjour, j'ai un petit problème que je ne comprends pas. Pourriez vous m'aider svp?
    J'ai ce code:

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    PROCEDURE (P1, P2, P3,...) IS
    .
    .
    EXCEPT1 EXCEPTION;
    BEGIN (PRINCIPAL)
     
       BEGIN (1)
           SELECT
       EXCEPTION
            WHEN OTHERS THEN
                 ....
       END;
     
       IF CONDITION1 THEN
           ...
           RAISE EXCEPT1;
       END IF;
     
       BEGIN(2)
            SELECT
       EXCEPTION
            WHEN OTHERS THEN
                 ....
       END;
     
    EXCEPTION
        WHEN EXCEPT1 THEN
             ....
        WHEN OTHERS THEN
             ....
    END;
    Lorsque l'exception EXCEPT1 est levée, il part vers le WHEN OTHERS du BEGIN(2).
    Est ce normal?
    Si c'est normal, quelle est la solution?

    Je vous remercie par avance pour votre aide.

  2. #2
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Non ce n'est pas normal. Il doit aller dans when except1.

    Assures-toi que tes blocs begin end sont correctement définis (=qu'il ne manque pas un end à un moment donné).

  3. #3
    Membre régulier Avatar de Titouf
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 177
    Points : 95
    Points
    95
    Par défaut
    ok je vérifie, merci

  4. #4
    Membre régulier Avatar de Titouf
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 177
    Points : 95
    Points
    95
    Par défaut
    En fait j'ai l'impression que c'est le debugger de TOAD, qui délire !!

  5. #5
    Membre régulier Avatar de Titouf
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 177
    Points : 95
    Points
    95
    Par défaut
    En fait non, ce cas se produit bien. J'ai bien vérifié les begin et les end.
    Mais en grattant, je me suis rendu compte de quelque chose.
    je suis dans la configuration suivante:

    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
    PROCEDURE (P1, P2, P3,...) IS
    .
    .
    EXCEPT1 EXCEPTION;
    BEGIN (PRINCIPAL)
       A := NULL;
       B := NULL;
       PKG_X.C := NULL;
       RAISE  EXCEPT1;
       BEGIN (1)
           SELECT
       EXCEPTION
            WHEN OTHERS THEN
                 ....
       END;
    
    EXCEPTION
        WHEN EXCEPT1 THEN
             ....
        WHEN OTHERS THEN
             ....
    END;
    Je pars dans le WHEN OTHERS de BEGIN(1).
    Si j'enlève le WHEN OTHERS de BEGIN(1), je vais dans EXCEPT1

    Je change et je suis dans cette config:

    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
    23
    PROCEDURE (P1, P2, P3,...) IS
    .
    .
    EXCEPT1 EXCEPTION;
    BEGIN (PRINCIPAL)
       A := NULL;
       B := NULL;
       RAISE  EXCEPT1;
       PKG_X.C := NULL;
    
       BEGIN (1)
           SELECT
       EXCEPTION
            WHEN OTHERS THEN
                 ....
       END;
    
    EXCEPTION
        WHEN EXCEPT1 THEN
             ....
        WHEN OTHERS THEN
             ....
    END;
    Je vais dans EXCEPT1 de l'exception générale.
    Là j'en peux plus, j'abandonne...
    Sauf si quelqu'un comprend mon pb, et me donne une solution.

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    Bonjour,

    ce comportement semble tout à fait normal.
    Tu place Ton when other avant ton when except1.
    Tu ne peux donc jamais le raiser (le except1).
    La bonne syntaxe devrait être:

    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
     
    PROCEDURE (P1, P2, P3,...) IS
    .
    .
    EXCEPT1 EXCEPTION;
    BEGIN (PRINCIPAL)
       A := NULL;
       B := NULL;
       RAISE  EXCEPT1;
       PKG_X.C := NULL;
     
       BEGIN (1)
           SELECT
       EXCEPTION
        WHEN EXCEPT1 THEN
             ....
        WHEN OTHERS THEN
       END;
     
     
             ....
    END;

  7. #7
    Membre régulier Avatar de Titouf
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 177
    Points : 95
    Points
    95
    Par défaut
    Pour moi il ne devrait pas rentrer dans le BEGIN(1) car c'est un autre bloc, donc moi ça ne me parait pas tout à fait normal.

    Ton coding est un peu différent du mien, l'exception qui est levée dans mon cas n'est pas sur le BEGIN(1), alors que dans le tien, ce serait le cas, et ce n'est pas exactement ce que je veux faire.

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    Citation Envoyé par Titouf
    Pour moi il ne devrait pas rentrer dans le BEGIN(1) car c'est un autre bloc, donc moi ça ne me parait pas tout à fait normal.
    SI!!
    Dans l'exemple que tu donne, tu t'arretes ici.
    Si tu ne veux pas que l'eereur when other que tu catch dans ta boucle begin1 soit bloquante, il faut que tu packages cette boucle. tu pourras prendre alors un choix qui ne sera pas forcément de sortir quand ta première exception apparaitra.

    Tu m'as compris?

  9. #9
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    bonjour aline,
    Je ne suis pas d'accord avec toi (ou alors je t'ai mal compris) :
    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
    SQL> declare err exception;
      2  begin
      3    raise err;
      4    begin
      5       null;
      6    exception
      7       when others then  
      8           dbms_output.put_line ('others 1');
      9    end;
     10  exception
     11    when err then
     12           dbms_output.put_line ('err principal');
     13    when others then
     14           dbms_output.put_line ('others principal');
     15  end;
     16  /
    err principal
    => il rentre bien dans le when err du bloc principal et non dans le when others du second bloc.


    Titouf : essaie d'attribuer la valeur de ta variable de package via une procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pkg_x.set_valeur_to_c (null);
    où set_valeur_to_c est codé de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure set_valeur_to_c (p_val) is
    begin
      c:= p_val;
    end;

  10. #10
    Membre régulier Avatar de Titouf
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 177
    Points : 95
    Points
    95
    Par défaut
    J'ai mis en commentaire les variables de package, et je l'ai remplacé par une variable normale, ça fait pareil...
    En fait c'est dès que je me rapproche du BEGIN(1) ... C'est dingue il en a peur, ou quoi? !!
    En tout cas c'est sympa de m'aider.
    Merci Aline et PlaineR

  11. #11
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    Citation Envoyé par plaineR
    bonjour aline,
    Je ne suis pas d'accord avec toi (ou alors je t'ai mal compris) :

    err principal[/CODE]
    => il rentre bien dans le when err du bloc principal et non dans le when others du second bloc.
    Nous sommes donc bien d'accord. Je m'étais surement mal exprimée.
    Ce que je disais, c'est que en mettant un when other dans ton bloc1, tu ne pouvais pas catcher les errreurs qui sont à la fin du bloc1 (et je pense que c'est cela que titouf cherche à faire).
    Je proposait donc pour pouvoir rentrer dans cette exception de remplacer le bloc 1 par une procédure.
    Ce qui donne:
    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
     
    PROCEDURE (P1, P2, P3,...) IS
    .
    .
    EXCEPT1 EXCEPTION;
    BEGIN (PRINCIPAL)
       A := NULL;
       B := NULL;
       RAISE  EXCEPT1;
       PKG_X.C := NULL;
     
       BEGIN 
        PROCEDURE1;
       EXCEPTION
        WHEN EXCEPT1 THEN
             ....
        WHEN OTHERS THEN
       END;
     
     
             ....
    END;

  12. #12
    Membre régulier Avatar de Titouf
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 177
    Points : 95
    Points
    95
    Par défaut
    tu as l'air sure de toi, Aline. Donc je vais surement utiliser ta méthode. Pourtant il me semblait que dans toutes les formations, et docs, que j'avais eues ou vues, l'exception descendait de bloc en bloc, et ne remontait pas vers des niveaux supérieurs.

    Dès que j'aurais un peu plus de temps, je reviendrais sur le problème en faisant du tri dans ma procédure qui est très chargée aujourd'hui, afin d'affiner l'étude.
    A la suite de cette étude, je vous tiendrais au courant de mes investigations.

    Dans tous les cas ta solution fonctionne, mais il y a un petit truc qui me chagrine, car je ne comprends pas complètement cette situation. Et j'aime pas ne pas comprendre...

    à vous deux

Discussions similaires

  1. [Oracle 8i][PL/SQL] requetes, SQLERRM & EXCEPTION
    Par Bahan dans le forum Oracle
    Réponses: 5
    Dernier message: 04/10/2007, 17h11
  2. [Oracle 8i - PL/SQL] Utilisation des exceptions
    Par Bahan dans le forum Oracle
    Réponses: 3
    Dernier message: 28/08/2006, 16h24
  3. [Oracle 9i] Traitement SQL sur une table
    Par Requin15 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 02/06/2006, 09h56
  4. Réponses: 3
    Dernier message: 26/05/2006, 00h06
  5. Réponses: 2
    Dernier message: 08/11/2005, 10h38

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