Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/01/2008, 22h15   #1
Membre habitué
 
Avatar de LinuxUser
 
Inscription : avril 2007
Messages : 450
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 450
Points : 131
Points : 131
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 :
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 :
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.
LinuxUser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 08h19   #2
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
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.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 16h19   #3
Membre habitué
 
Avatar de LinuxUser
 
Inscription : avril 2007
Messages : 450
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 450
Points : 131
Points : 131
Ca n'a rien changé, j'ai toujours

Code :
1
2
3
4
 
SQL> exec affiche('azerty',3);
azerty
PL/SQL procedure successfully completed
Au lieu de
Code :
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.
LinuxUser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 16h24   #4
Membre Expert
 
Homme
Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)
Inscription : mars 2003
Messages : 645
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 41
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)

Informations forums :
Inscription : mars 2003
Messages : 645
Points : 1 165
Points : 1 165
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 ?
phili_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 16h50   #5
Membre habitué
 
Avatar de LinuxUser
 
Inscription : avril 2007
Messages : 450
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 450
Points : 131
Points : 131
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.
LinuxUser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 16h59   #6
Membre Expert
 
Homme
Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)
Inscription : mars 2003
Messages : 645
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 41
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)

Informations forums :
Inscription : mars 2003
Messages : 645
Points : 1 165
Points : 1 165
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 ?
phili_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 17h25   #7
Membre habitué
 
Avatar de LinuxUser
 
Inscription : avril 2007
Messages : 450
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 450
Points : 131
Points : 131
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.
LinuxUser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 17h28   #8
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
personnellement j'ai jamais vu PUT fonctionner... c'est un mystère cette procédure pour moi
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 17h52   #9
Membre habitué
 
Avatar de LinuxUser
 
Inscription : avril 2007
Messages : 450
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 450
Points : 131
Points : 131
Connaissez-vous une autre procédure qui imprime à l'écran sans sauter de ligne ensuite( et qui marche) ?
LinuxUser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 18h41   #10
Membre Expert
 
Homme
Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)
Inscription : mars 2003
Messages : 645
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 41
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)

Informations forums :
Inscription : mars 2003
Messages : 645
Points : 1 165
Points : 1 165
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 :
rpad(rpad (C,5),10,'*')
phili_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 19h37   #11
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Avec Oracle 10.2.0.1 PUT et NEW_LINE fonctionnent correctement:

Code :
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
.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 21h34   #12
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Citation:
Envoyé par juve1897 Voir le message
Code :
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 :
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      ****
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/10/2009, 14h28   #13
Membre actif
 
Avatar de Laurent_du_78
 
Inscription : juin 2007
Messages : 129
Détails du profil
Informations personnelles :
Âge : 46
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : juin 2007
Messages : 129
Points : 161
Points : 161
Je fait remonter un ancien post.

il faut mettre
SET serveroutput on et SET feedback 0

Code :
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      ****
Laurent_du_78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h15.


 
 
 
 
Partenaires

Hébergement Web