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 :

[Sql] Probleme de recuperation de variable


Sujet :

Oracle

  1. #1
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 49
    Par défaut [Sql] Probleme de recuperation de variable
    Bonjour,
    Je travail sur un Oracle 9.2.0.4
    J'ai un probleme avec un bout de code que je ne comprend (le probleme pas le 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
    procedure toto
    IS
    err varchar2(255):
    BEGIN
      LOOP
        BEGIN
        procedure tata (err)
     
        EXCEPTION ....
           DBMS_OUTPUT.PUT8LINE(err)
        END;
      END LOOP;
    EXCEPTION ......
    END;
    La procedure tata a le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure tata (p_err in out varchar2)
    Is
     ....
    BEGIN
      .......
    EXCEPTION ...
       p_err := 'mon message';
       RAISE;
    END;
    Et bien mon DBMS_OUTPUT n'a pas la valeur 'mon message' dans la procedure toto

    Quelqu'un a une idee ????

    Merci d'avance
    LoKi

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Citation Envoyé par loki8
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure toto
    IS
    err varchar2(255):
    BEGIN
      LOOP
        BEGIN
        procedure tata (err) -- cet appel n'est-il pas incorrect ????
    
        EXCEPTION ....
           DBMS_OUTPUT.PUT8LINE(err)
        END;
      END LOOP;
    EXCEPTION ......
    END;
    Et bien mon DBMS_OUTPUT n'a pas la valeur 'mon message' dans la procedure toto
    D'accord et quelle est sa valeur (peut être serait-il bon que vous nous donniez tout votre code) ?

  3. #3
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 49
    Par défaut
    procedure toto
    IS
    err varchar2(255):
    BEGIN
    LOOP
    BEGIN
    tata (err);
    EXCEPTION ....
    DBMS_OUTPUT.PUT8LINE(err)
    END;
    END LOOP;
    EXCEPTION ......
    END;
    Voila j'ai corrige l'appel de la procedure desole.
    La valeur du message devrait etre 'mon message', car il est sous entendu que la procedure genere une exception.

    LoKi

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Citation Envoyé par loki8
    La valeur du message devrait etre 'mon message', car il est sous entendu que la procedure genere une exception.
    D'accord mais si vous n'obtenez pas 'mon message', qu'obtenez-vous (aucun message, erreur Oracle, libellé du message d'erreur différent, etc.) ?

  5. #5
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 49
    Par défaut
    Desole je n'avais pas compris

    La variable est vide.
    Le DBMS_OUTPUT retourne a la ligne.

    LoKi

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    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
    21
    22
    23
    24
    create or replace procedure tata(p_err in out varchar2) is
      trouve number(1);
    begin
      select 1
      into   trouve
      from dual
      where 1=2; -- génère toujours une exception
    exception when no_data_found then
      p_err := 'mon message';
    end;
    /
     
    create or replace procedure toto is
     err varchar2(255);
    begin
      err := 'toto';
      begin
        tata(err);
      exception when no_data_found then
        dbms_output.put_line('EXCEPTION --> err = ' || err);
      end;
      dbms_output.put_line('err = ' || err);
    end;
    /
    produit :
    Procédure créée.


    Procédure créée.

    8i ALEX> exec toto;
    EXCEPTION --> err = toto
    err = toto

    Procédure PL/SQL terminée avec succès.
    Et
    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
    create or replace procedure tata(p_err in out varchar2) is
      trouve number(1);
    begin
      select 1
      into   trouve
      from dual
      where 1=2; -- génère toujours une exception
    exception when no_data_found then
      p_err := 'mon message';
    --  RAISE; -- SEULE DIFFERENCE AVEC LE CODE PRECEDENT !!!!
    end;
    /
     
    create or replace procedure toto is
     err varchar2(255);
    begin
      err := 'toto';
      begin
        tata(err);
      exception when no_data_found then
        dbms_output.put_line('EXCEPTION --> err = ' || err);
      end;
      dbms_output.put_line('err = ' || err);
    end;
    /
    produit cette fois :
    Procédure créée.


    Procédure créée.

    8i ALEX> exec toto;
    err = mon message

    Procédure PL/SQL terminée avec succès.
    J'avoue que je suis un peu étonné de ce comportement mais j'utilise jamais RAISE.
    La doc devrait vous permettre de comprendre la raison.

  7. #7
    Expert confirmé
    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
    Par défaut
    RAISE provoque la levée d'une exception (celle en cours de traitement si ele n'ext pas explcitement nommée). Les instructions qui suivent ne sont donc pas exécutées.

  8. #8
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 49
    Par défaut
    Je viens de faire un autre test encore plus "bizarre":
    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
    create or replace procedure tata(p_err in out varchar2) is
    BEGIN
      p_err := tata
      select 1
      into   trouve
      from dual
      where 1=2;
    END;
     
    create or replace procedure toto is
    BEGIN
      err := 'toto';
      BEGIN    
        tata(err);
      exception when no_data_found then
        dbms_output.put_line(err);
      END;
    END;
    Et bien j'ai la valeur toto et non pas tata ????? alors qu'aucun bloc exception n'est implimente, AU SECOURS

    LoKi

  9. #9
    Expert confirmé
    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
    Par défaut
    Je ne vois pas comment vous pouvez obtenir le moindre résultat alors qu'auncune de vos fonctions ne compile !

    pouvez-vous joindre le code complet que vous utilisez ?

  10. #10
    Expert confirmé
    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
    Par défaut
    En tout cas, la levée de l'exception provoquée ou non par RAISE aborte la fonction appelée. La variable IN OUT n'est donc pas mise à jour.

  11. #11
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 49
    Par défaut
    Citation Envoyé par SheikYerbouti
    En tout cas, la levée de l'exception provoquée ou non par RAISE aborte la fonction appelée. La variable IN OUT n'est donc pas mise à jour.
    Si je comprend bien, du moment qu'une fonction leve une exception aucune variable OUT n'est mise a jour ?

    LoKi

  12. #12
    Expert confirmé
    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
    Par défaut
    oui, c'est bien ce que je crains.

  13. #13
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 49
    Par défaut
    Merci de vos reponses
    on va donc gerer nos messages autrement entre ces deux procedures.

    LoKi

  14. #14
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Citation Envoyé par SheikYerbouti
    oui, c'est bien ce que je crains.
    J'en suis arrivé à la même conclusion avec mon exemple précédent et je pense qu'en remplaçant la procedure TATA par cette FUNCTION TATA alors ça confirme ton hypothèse :
    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
    create or replace function tata(p_err in out varchar2) return varchar2 is
      trouve number(1);
    begin
      begin
        select 1
        into   trouve
        from dual
        where 1=2; -- génère toujours une exception
      exception when no_data_found then
        p_err := 'mon message';
    --    RAISE;
      end;
      return 'fin de fonction...';
    end;
    /
    Sans RAISE alors la procédure appelant récupère 'fin de fonction' mais s'il existe un RAISE alors la valeur de retour de cette fonction TATA est ''

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

Discussions similaires

  1. Probleme de recuperation de variable
    Par xclam dans le forum Langage
    Réponses: 3
    Dernier message: 25/04/2007, 11h55
  2. [WAP et XML] probleme de recuperation de variable
    Par gba_gui dans le forum Langage
    Réponses: 1
    Dernier message: 13/03/2007, 10h58
  3. Réponses: 2
    Dernier message: 30/06/2006, 09h07
  4. Réponses: 1
    Dernier message: 22/05/2006, 14h44
  5. [Variable d'environement SQL] Probleme de config
    Par duelooser dans le forum Oracle
    Réponses: 2
    Dernier message: 16/12/2005, 09h16

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