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 :

Procedure problème DBMS_OUTPUT.PUT


Sujet :

SQL Oracle

  1. #1
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 594
    Points
    594
    Par défaut Procedure problème DBMS_OUTPUT.PUT
    Bonsoir, je bloque depuis tout à l'heure sur un problème d'affichage.
    Je ne comprend pas pourquoi les étoiles ne s'affichent pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE OR REPLACE PROCEDURE affiche(nom Fournisseur.nomFournisseur%TYPE, etoile INTEGER)
    IS
    BEGIN
      DBMS_OUTPUT.PUT_LINE(nom ||'      ');
      FOR i IN 1 .. etoile LOOP
        DBMS_OUTPUT.PUT('*');
      END LOOP;
    END;
    /
    Pas d'érreurs, mais l'execution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SQL> exec affiche('azerty',3);
    azerty
     
    PL/SQL procedure successfully completed.
    Je précise que j'ai activé SET SERVEROUTPUT ON.
    Voilà , merci.

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Vous pouvez par exemple ajouter DBMS_OUTPUT.NEW_LINE après la boucle pour vider le buffer et provoquer le saut de ligne.

    Voir la doc. de référence de DBMS_OUTPUT.PUT.

  3. #3
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 594
    Points
    594
    Par défaut
    Ca n'a rien changé, j'ai toujours

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SQL> exec affiche('azerty',3);
    azerty
    PL/SQL procedure successfully completed
    Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SQL> exec affiche('azerty',3);
    azerty       ***
    Je ne comprend pas pourquoi ce qui est dans la boucle ne s'affiche pas, il doit y avoir une subtilité qui m'échappe.

  4. #4
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    et c'est quoi le type correspondant à Fournisseur.nomFournisseur%TYPE ?
    ça serait pas un char très long au lieu d'un varchar ? donc on pourrait essayer en trimant le nom et/ou en modifiant le type ?

  5. #5
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 594
    Points
    594
    Par défaut
    Un VARCHAR2(128), je pense pas que ce soit énorme.
    Qu'en pensez-vous?

    De plus ma procédure est appelée dans par une autre procédure, mais dans l'exemple je l'ai testée manuellement avec un simple :
    exec affiche(....);

    A la place du fournisseur j'ai mis un mot court : azerty.

    Donc voilà, je ne vois pas ce qui cloche.

  6. #6
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    ah ok.
    Non pour moi le problème serait venu d'un char. Mais si c'est un varchar2 on n'aura pas le problème d'espaces en trop à droite.

    Après il faudrait peut-être expliquer le problème plus dans son ensemble. Dbms_output c'est seulement pour faire du débuggage. On peut sans doute répondre à ton problème d'une autre façon ?

  7. #7
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 594
    Points
    594
    Par défaut
    En fait comme je l'ai déjà dit cette procédure est appelée par une autre procédure qui lui donne les arguments (nomFournisseur,nombre).
    Ensuite la procédure en question doit afficher "nomFournisseur" et à coté
    "nombre" d'étoile *.
    Et pour que les étoiles soit l'une à coté de l'autre (et non l'une en dessous de l'autre comme avec DBMS......PUT_LINE) j'utilise DBMS_OUTPUT.PUT car je ne sais pas faire autrement.

    Je ne sais si je l'ai déjà dit ma ça marche avec DBMS_OUTPUT.PUT_LINE.

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    personnellement j'ai jamais vu PUT fonctionner... c'est un mystère cette procédure pour moi

  9. #9
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 594
    Points
    594
    Par défaut
    Connaissez-vous une autre procédure qui imprime à l'écran sans sauter de ligne ensuite( et qui marche) ?

  10. #10
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Citation Envoyé par juve1897 Voir le message
    En fait comme je l'ai déjà dit cette procédure est appelée par une autre procédure qui lui donne les arguments (nomFournisseur,nombre).
    Ensuite la procédure en question doit afficher "nomFournisseur" et à coté
    "nombre" d'étoile *.
    Et pour que les étoiles soit l'une à coté de l'autre (et non l'une en dessous de l'autre comme avec DBMS......PUT_LINE) j'utilise DBMS_OUTPUT.PUT car je ne sais pas faire autrement.
    ça ne réponds pas à ma question. Qui utilises cela et qu'en attend-t-il? C'est forcément un développeur ou un dba vu dbms_output. ou alors tu t'en sers pour un spool sql*plus ?

    Pour moi la fonctionnalité "Ajouter 5 espaces et 10 étoiles à droite d'une chaine de caractère C" ça peut aussi s'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rpad(rpad (C,5),10,'*')

  11. #11
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Avec Oracle 10.2.0.1 PUT et NEW_LINE fonctionnent correctement:

    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
    SQL> 
    SQL> set serveroutput on;
    SQL> 
    SQL> select * from v$version;
     
    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
    PL/SQL Release 10.2.0.1.0 - Production
    CORE    10.2.0.1.0      Production
    TNS for Linux: Version 10.2.0.1.0 - Production
    NLSRTL Version 10.2.0.1.0 - Production
     
    SQL> 
    SQL> declare
      2  etoile number := 3;
      3  begin
      4  dbms_output.put('azerty' || '       ' );
      5    for i in 1 .. etoile loop
      6      dbms_output.put('*');
      7    end loop ;
      8    dbms_output.new_line;
      9  end;
     10  /
    azerty    ***
     
    Procedure PL/SQL terminee avec succes
    .

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par juve1897 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SQL> exec affiche('azerty',3);
    azerty       ***
    Je ne comprend pas pourquoi ce qui est dans la boucle ne s'affiche pas, il doit y avoir une subtilité qui m'échappe.
    Non la procédure n'est pas censée donner ça étant donné que tu utilise put_line() et non put() au départ.

    En tout cas sur ma base ça fonctionne
    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
    set serveroutput on
    
    CREATE OR REPLACE PROCEDURE affiche(nom Varchar2, etoile INTEGER)
    IS
    BEGIN
      DBMS_OUTPUT.PUT(nom ||'      ');
      FOR i IN 1 .. etoile LOOP
        DBMS_OUTPUT.PUT('*');
      END LOOP;
      DBMS_OUTPUT.NEW_LINE;
    END;
    /
    
    PROCEDURE affiche(nom Compiled.
    exec affiche('azerty', 4)
    
    anonymous block completed
    azerty      ****

  13. #13
    Membre habitué Avatar de Laurent_du_78
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2007
    Messages : 138
    Points : 188
    Points
    188
    Par défaut
    Je fait remonter un ancien post.

    il faut mettre
    SET serveroutput on et SET feedback 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SQL> exec affiche('azerty', 4)
     
    PL/SQL procedure successfully completed.
     
    SQL>  SET serveroutput on
    SQL>  exec affiche('azerty', 4)
    azerty      ****
     
    PL/SQL procedure successfully completed.
     
    SQL>  SET feedback 0
    SQL>  exec affiche('azerty', 4)
    azerty      ****

Discussions similaires

  1. trigger procedure probléme
    Par devone dans le forum Requêtes
    Réponses: 3
    Dernier message: 19/05/2011, 10h50
  2. Réponses: 4
    Dernier message: 13/12/2006, 00h08
  3. problème dbms_output .put
    Par lazzeroni dans le forum Oracle
    Réponses: 5
    Dernier message: 27/06/2006, 15h34
  4. Problème dans une procedure
    Par hpghost dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 09/01/2005, 12h14
  5. [PowerBuilder/Oracle] Problème de procedure stockée
    Par delphine_lep dans le forum Powerbuilder
    Réponses: 1
    Dernier message: 02/09/2004, 14h08

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