Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 18/11/2011, 00h57   #1
Invité de passage
 
Inscription : août 2009
Messages : 22
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 22
Points : 3
Points : 3
Par défaut Problème avec ma procédure

bonjour, j'ai un souci avec ma procedure(elle est sensée me sortir un truc du genre une facture) qui est la suivante:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
SHOW err;
		CREATE OR REPLACE PROCEDURE 
		imprimer_facture(numcom IN  Commandes.num_com%TYPE)
        IS
             taux            float;
			 -- Variable pour l'affichage de l''entête de la facture
			 numeroclient    Clients.num_cli%TYPE;
			 nomclient       Clients.nom_cli%TYPE;
			 adresseclient   Clients.adress_cli%TYPE;
			 telephoneclient Clients.numtel_cli%TYPE;
			 datecommande    Commandes.date_com%TYPE;
 
			 -- Variables dans MonCurseur pour l'affichage dans la facture
			 numeroproduit   Produits.num_pro%TYPE;
			 libelleproduit  Produits.lib_pro%TYPE;
			 quantitecommade Ligne_Coms.qte_com%TYPE;
			 prix_unitaire   Produits.prix_u%TYPE;
			 prixproduit     Produits.prix_u%TYPE;
			 MontantTotal    Commandes.mtot_com%TYPE;
 
			 -- Déclaration du curseur
			 CURSOR MonCurseur 
			 IS
			 SELECT* FROM Commandes,Produits,Clients,Ligne_Coms
			 WHERE         Commandes.num_com  = numcom
			 AND           Clients.num_cli    = Commandes.num_com
			 AND           Ligne_Coms.num_com = Commandes.num_com
			 AND           Produits.num_pro   = Ligne_Coms.num_pro
			 ORDER BY      Produits.num_pro ASC;--ligne 28
        BEGIN
 
		    taux:=0.18;
 
			-- Pour l'affichage de l'entête de la facture
			SELECT Clients.num_cli,Clients.nom_cli,Clients.adress_cli,Clients.numtel_cli,Commandes.Mtot_Com,Commandes.date_com 
			INTO   numeroclient,nomclient,adresseclient,telephoneclient,MontantTotal,datecommande
			FROM   Commandes,Produits,Clients,Ligne_Coms
			WHERE  Commandes.num_com  = numcom
			AND    Clients.num_cli    = Commandes.num_com
			AND    Ligne_Coms.num_com = Commandes.num_com
			AND    Produits.num_pro   = Ligne_Coms.num_pro;
 
			 -- Affichage de l'entête de la facture 
			 DBMS_OUTPUT.PUT_LINE('Client N°    :'||numeroclient);
			 DBMS_OUTPUT.PUT_LINE('Nom          :'||nomclient);
			 DBMS_OUTPUT.PUT_LINE('Adresse      :'||adresseclient);
			 DBMS_OUTPUT.PUT_LINE('Telephone    :'||telephoneclient);
			 DBMS_OUTPUT.PUT_LINE('______________________________________________________________________________________________________________');
 
			 -- Affichage du numero et de la date de la commande 
			 DBMS_OUTPUT.PUT_LINE('Commande N°  :'||numcom);
			 DBMS_OUTPUT.PUT_LINE('Du           :'||datecommande);
 
			 -- Affichage des entêtes concernant les différents produits de la facture 
			 DBMS_OUTPUT.PUT_LINE('Prod N°  |      Libelle      |    QteCom    |   Prix Unitaire   |   Prix Prod   |   TVA   ');
 
			OPEN   MonCurseur;
           -- FETCH  MonCurseur INTO numeroproduit,libelleproduit,quantitecommade,prix_unitaire;
            --WHILE (MonCurseur%FOUND) 
			LOOP
			       FETCH  MonCurseur INTO numeroproduit,libelleproduit,quantitecommade,prix_unitaire;
			       prixproduit:=quantitecommade*(prix_unitaire + taux); -- Calcul du prix du produit
                   DBMS_OUTPUT.PUT_LINE(numeroproduit||'--'||libelleproduit||'--'||quantitecommade||'--'||prix_unitaire||'--'||prixproduit||'--'||taux);
            END LOOP;
			CLOSE MonCurseur;
            DBMS_OUTPUT.PUT_LINE('MONTANT TOTAL   :'|| MontantTotal ||'FCFA');             
 
        END ;
Voici l'erreur:
Code :
1
2
3
LINE/COL 	ERROR
60/11 	PL/SQL: SQL Statement ignored
60/11 	PLS-00394: nombre de valeurs erroné dans liste INTO d'une instruc tion FETCH
. Je ne vois pas l'erreur. SOS!!!
yabo84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 01h43   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Code :
1
2
CURSOR MonCurseur IS
SELECT *
select * ça n'est pas utilisable pour du code en production, il faut selectionner explicitement les 4 colonnes qui t'intéressent.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/11/2011, 15h27   #3
Membre chevronné
 
Homme O. Joly
Support
Inscription : décembre 2010
Messages : 287
Détails du profil
Informations personnelles :
Nom : Homme O. Joly
Âge : 38
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Support
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2010
Messages : 287
Points : 617
Points : 617
Personnellement je préfère ce type d'écriture que je trouve plus lisible :

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
CREATE OR REPLACE PROCEDURE imprimer_facture(numcom IN  Commandes.num_com%TYPE)
IS
  taux   float;
  prixproduit float;
 
  numeroclient Clients.num_cli%TYPE;
  nomclient    Clients.nom_cli%TYPE;
  adresseclient   Clients.adress_cli%TYPE;
  telephoneclient Clients.numtel_cli%TYPE;
  datecommande Commandes.date_com%TYPE;
 
  MontantTotal Commandes.mtot_com%TYPE;
 
BEGIN
 
 taux:=0.18;
 
 -- Pour l'affichage de l'entête de la facture
 SELECT Clients.num_cli,Clients.nom_cli,Clients.adress_cli,Clients.numtel_cli,Commandes.Mtot_Com,Commandes.date_com 
 INTO   numeroclient,nomclient,adresseclient,telephoneclient,MontantTotal,datecommande
 FROM   Commandes,Produits,Clients,Ligne_Coms
 WHERE  Commandes.num_com  = numcom
   AND Clients.num_cli = Commandes.num_com
   AND Ligne_Coms.num_com = Commandes.num_com
   AND Produits.num_pro   = Ligne_Coms.num_pro;
 
  -- Affichage de l'entête de la facture 
  DBMS_OUTPUT.PUT_LINE('Client N° :'||numeroclient);
  DBMS_OUTPUT.PUT_LINE('Nom       :'||nomclient);
  DBMS_OUTPUT.PUT_LINE('Adresse   :'||adresseclient);
  DBMS_OUTPUT.PUT_LINE('Telephone :'||telephoneclient);
  DBMS_OUTPUT.PUT_LINE('______________________________________________________________________________________________________________');
 
  -- Affichage du numero et de la date de la commande 
  DBMS_OUTPUT.PUT_LINE('Commande N°  :'||numcom);
  DBMS_OUTPUT.PUT_LINE('Du     :'||datecommande);
 
  -- Affichage des entêtes concernant les différents produits de la facture 
  DBMS_OUTPUT.PUT_LINE('Prod N°  |   Libelle   | QteCom |   Prix Unitaire   |   Prix Prod   |   TVA   ');
 
 FOR c IN ( SELECT * FROM Commandes,Produits,Clients,Ligne_Coms
            WHERE   Commandes.num_com  = numcom
              AND     Clients.num_cli = Commandes.num_com
              AND     Ligne_Coms.num_com = Commandes.num_com
              AND     Produits.num_pro   = Ligne_Coms.num_pro
            ORDER BY   Produits.num_pro ASC )
 LOOP
     prixproduit:=c.qte_com*(c.prix_u + taux); -- Calcul du prix du produit
     DBMS_OUTPUT.PUT_LINE(c.num_pro||'--'||c.lib_pro||'--'||c.qte_com||'--'||c.prix_u||'--'||prixproduit||'--'||taux);
 END LOOP;
 DBMS_OUTPUT.PUT_LINE('MONTANT TOTAL   :'|| MontantTotal ||'FCFA');    
END ;
/
C'est juste une question de goût j'en conviens ...
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/11/2011, 23h06   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
Envoyé par ojo77 Voir le message
C'est juste une question de goût j'en conviens ...
+1
Un for loop est quand même beaucoup plus simple à écrire/lire qu'un open loop fetch exit close...
Je pense qu'il n'y a pas photo !
skuatamad 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 13h54.


 
 
 
 
Partenaires

Hébergement Web