Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
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 30/11/2007, 17h11   #1
Membre habitué
 
Avatar de elvan49
 
Laurent
Développeur Web
Inscription : octobre 2006
Messages : 226
Détails du profil
Informations personnelles :
Nom : Laurent
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : octobre 2006
Messages : 226
Points : 141
Points : 141
Envoyer un message via Skype™ à elvan49
Par défaut [procedure] une erreur de syntaxe, mais où ?

Bonjour,

Je démarre dans la création des procédures MySQL. Voici mon code et j'ai une erreur visiblement au niveau de l'affectation de c...
Code :
1
2
3
4
5
6
7
8
9
10
11
12
DELIMITER //
CREATE PROCEDURE Liste_Pays()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE c INT DEFAULT 1; 
    INSERT INTO c VALUES(SELECT COUNT(nom_pays) FROM pays);
    WHILE i<=c DO
        SELECT nom_pays, id_pays FROM pays;
        SET i:=i+1;
    END WHILE;    
END//
DELIMITER ;
Peut-onm'aider ? merci.
__________________
"n'imprimez ces messages que si nécessaire... Préservez notre planète"
elvan49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2007, 17h18   #2
Membre éclairé
 
Avatar de jota5450
 
Jota Alves
Inscription : janvier 2006
Messages : 263
Détails du profil
Informations personnelles :
Nom : Jota Alves
Âge : 36

Informations forums :
Inscription : janvier 2006
Messages : 263
Points : 303
Points : 303
slt...


set i = ... il y a pas les :
Citation:
INSERT INTO c VALUES(SELECT COUNT(nom_pays) FROM pays);
Ton c est int... du devrais pas inserer dans une table?

et puis la bonne syntaxe est:

Code :
INSERT INTO TA_TABLE(TON_CHAMP) SELECT count(nom_pays) FROM pays
jota5450 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2007, 13h28   #3
Membre habitué
 
Avatar de elvan49
 
Laurent
Développeur Web
Inscription : octobre 2006
Messages : 226
Détails du profil
Informations personnelles :
Nom : Laurent
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : octobre 2006
Messages : 226
Points : 141
Points : 141
Envoyer un message via Skype™ à elvan49
Par défaut SEt au lieu d'INSERT

Bonjour, merci de ces précisions

Est-ce qu'il ne vaudrait mieux pas quelque chose du genre :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 DELIMITER //
CREATE PROCEDURE Liste_Pays()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE c INT DEFAULT 1; 
    SET c = SELECT COUNT(nom_pays) FROM pays);
    WHILE i<=c DO
        SELECT nom_pays, id_pays FROM pays;
        SET i=i+1;
    END WHILE;    
END//
DELIMITER ;
L'idée est de donner le résultat de count comme valeur à c...
Je vais tester.
__________________
"n'imprimez ces messages que si nécessaire... Préservez notre planète"
elvan49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2007, 12h43   #4
Membre Expert
 
Avatar de Sivrît
 
Inscription : février 2006
Messages : 953
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2006
Messages : 953
Points : 1 189
Points : 1 189
Citation:
Envoyé par elvan49 Voir le message
Bonjour, merci de ces précisions

Est-ce qu'il ne vaudrait mieux pas quelque chose du genre :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 DELIMITER //
CREATE PROCEDURE Liste_Pays()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE c INT DEFAULT 1; 
    SET c = SELECT COUNT(nom_pays) FROM pays);
    WHILE i<=c DO
        SELECT nom_pays, id_pays FROM pays;
        SET i=i+1;
    END WHILE;    
END//
DELIMITER ;
L'idée est de donner le résultat de count comme valeur à c...
Je vais tester.
Je crois que la syntaxe que tu recherches est
Code :
1
2
3
 
    DECLARE c INT; 
    SELECT COUNT(nom_pays) INTO c FROM pays;
(http://dev.mysql.com/doc/refman/5.0/...statement.html)
Sivrît est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2007, 19h26   #5
Membre habitué
 
Avatar de elvan49
 
Laurent
Développeur Web
Inscription : octobre 2006
Messages : 226
Détails du profil
Informations personnelles :
Nom : Laurent
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : octobre 2006
Messages : 226
Points : 141
Points : 141
Envoyer un message via Skype™ à elvan49
Par défaut Merci beaucoup

Merci, c'est ça !
Le lien vers mysqlAB good bien vu. J'y suis souvent mais quand on ne sait pas quoi chercher, c'est pas simple... Là direct !
__________________
"n'imprimez ces messages que si nécessaire... Préservez notre planète"
elvan49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 09h07   #6
Membre habitué
 
Avatar de elvan49
 
Laurent
Développeur Web
Inscription : octobre 2006
Messages : 226
Détails du profil
Informations personnelles :
Nom : Laurent
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : octobre 2006
Messages : 226
Points : 141
Points : 141
Envoyer un message via Skype™ à elvan49
Par défaut J'ai dit "c'est ça" mais...

Bonjour,

Je me suis un peu trop emporté.
La procédure a bien une syntaxe correcte mais son appel ne renvoie pas le résultat escompté, au contraire j'ai :
Code :
 #1312 - PROCEDURE base_type.Liste_Pays can't return a result set in the given context
Je voulais la liste des pays...
__________________
"n'imprimez ces messages que si nécessaire... Préservez notre planète"
elvan49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 09h14   #7
Membre habitué
 
Avatar de elvan49
 
Laurent
Développeur Web
Inscription : octobre 2006
Messages : 226
Détails du profil
Informations personnelles :
Nom : Laurent
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : octobre 2006
Messages : 226
Points : 141
Points : 141
Envoyer un message via Skype™ à elvan49
Par défaut je progresse vers la vérité...

C'est déjà mieux et ça me donne une indication sur ce qui me manque.
Visiblement, il ne me reste plus qu'à trouver comment lui dire de stocker les résultats nonpas dans une variable mais dans une colonne...
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
DELIMITER //
CREATE PROCEDURE Liste_Pays()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE liste VARCHAR(50);
    DECLARE c INT DEFAULT 1; 
    SELECT COUNT(nom_pays) INTO c FROM pays;
    WHILE i<=c DO
        SELECT nom_pays INTO liste FROM pays;
        SET i:=i+1;
    END WHILE;    
END//
DELIMITER ;
Je précise que ce code donne cette erreur :
Code :
 #1172 - Result consisted of more than one row
à suivre...
__________________
"n'imprimez ces messages que si nécessaire... Préservez notre planète"
elvan49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 09h47   #8
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
le probleme vient du fait que ton
Code :
SELECT nom_pays INTO liste FROM pays;
te renvoi plusieurs resultats.

tu peux utiliser un curseur.
pop_up est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 10h05   #9
Membre habitué
 
Avatar de elvan49
 
Laurent
Développeur Web
Inscription : octobre 2006
Messages : 226
Détails du profil
Informations personnelles :
Nom : Laurent
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : octobre 2006
Messages : 226
Points : 141
Points : 141
Envoyer un message via Skype™ à elvan49
Par défaut Dernière étape (...?...)

Voici le code de procédure valide (en tout cas sans faute de syntaxe)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DELIMITER //
CREATE PROCEDURE Liste_Pays()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE liste VARCHAR(50);
    DECLARE c INT DEFAULT 1;
    DECLARE curseur1 CURSOR FOR SELECT nom_pays FROM pays;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    OPEN curseur1;
    SELECT COUNT(nom_pays) INTO c FROM pays;
    WHILE i<=c DO
        FETCH curseur1 INTO liste;
        SET i:=i+1;
    END WHILE;
    CLOSE curseur1;
END//
DELIMITER ;
L'appel ne renvoie plus d'erreur, mais il ne m'affiche rien
__________________
"n'imprimez ces messages que si nécessaire... Préservez notre planète"
elvan49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 10h12   #10
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
essaye ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
DELIMITER //
CREATE PROCEDURE Liste_Pays()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE liste VARCHAR(50);
    DECLARE c INT DEFAULT 1;
    DECLARE curseur1 CURSOR FOR SELECT nom_pays FROM pays;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    OPEN curseur1;
    FETCH curseur1 INTO liste;
    SELECT COUNT(nom_pays) INTO c FROM pays;
    WHILE NOT done DO
        SET i=i+1;
        FETCH curseur1 INTO liste; 
    END WHILE;
    CLOSE curseur1;
END//
DELIMITER ;
J'ai modifié la condition while et les fetch.


EDIT: il faut que tu declares ta variable "done" en INT aussi
pop_up est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 10h25   #11
Membre habitué
 
Avatar de elvan49
 
Laurent
Développeur Web
Inscription : octobre 2006
Messages : 226
Détails du profil
Informations personnelles :
Nom : Laurent
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : octobre 2006
Messages : 226
Points : 141
Points : 141
Envoyer un message via Skype™ à elvan49
Par défaut Toujours rien d'affiché

Merci du tuyaux,

Le résultat semble être le même qu'avec la procédure précédente. Requête éxécutée mais aucun résultat affiché...
Ne faudrait-il pas un SELECT pour qu'elle affiche quelque chose ?
Et un SELECT sur quoi ???
__________________
"n'imprimez ces messages que si nécessaire... Préservez notre planète"
elvan49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 10h56   #12
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
que veut tu que ça t'affiche ?

si tu veux afficher i, essaye ça :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
DELIMITER //
CREATE PROCEDURE Liste_Pays() RETURNS INT
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE liste VARCHAR(50);
    DECLARE c INT DEFAULT 1;
    DECLARE curseur1 CURSOR FOR SELECT nom_pays FROM pays;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    OPEN curseur1;
    FETCH curseur1 INTO liste;
    SELECT COUNT(nom_pays) INTO c FROM pays;
    WHILE NOT done DO
        SET i=i+1;
        FETCH curseur1 INTO liste; 
    END WHILE;
    CLOSE curseur1;
    RETURN i;
END//
DELIMITER ;
pop_up est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 11h11   #13
Membre habitué
 
Avatar de elvan49
 
Laurent
Développeur Web
Inscription : octobre 2006
Messages : 226
Détails du profil
Informations personnelles :
Nom : Laurent
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : octobre 2006
Messages : 226
Points : 141
Points : 141
Envoyer un message via Skype™ à elvan49
Par défaut RETURN uniquement pour FUNCTION

Désolé, mais RETURN n'est valide que pour les fonctions. Pas pour les Procédures.
Je voudrai afficher la liste des pays (leur nom) l'équivalent de :
Code :
SELECT nom_pays FROM pays ORDER BY nom_pays ASC;
La requête de base est simple et je peux la traiter en PHP, mais vu qu'elle ne nécessite aucun paramètre (type POST ou GET) je voudrai l'enlever de mes scripts et donc la stocker (avec d'autres du même genre) directement dans la base (je crée ainsi un niveau d'abstratction supllémentaire).

J'éspère avoir été plus clair sur mes intentions. Merci entout cas pour ton aide.
__________________
"n'imprimez ces messages que si nécessaire... Préservez notre planète"
elvan49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 11h25   #14
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
j'ai trouvé ce lien

j'espere que ça t'aidera
pop_up est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h33.


 
 
 
 
Partenaires

Hébergement Web