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 Procédural MySQL Discussion :

[procedure] une erreur de syntaxe, mais où ?


Sujet :

SQL Procédural MySQL

  1. #1
    Membre actif Avatar de elvan49
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 274
    Points : 204
    Points
    204
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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"

  2. #2
    Membre averti Avatar de jota5450
    Inscrit en
    Janvier 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2006
    Messages : 263
    Points : 332
    Points
    332
    Par défaut
    slt...


    set i = ... il y a pas les :
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into TA_TABLE(TON_CHAMP) select count(nom_pays) from pays

  3. #3
    Membre actif Avatar de elvan49
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 274
    Points : 204
    Points
    204
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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"

  4. #4
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        DECLARE c INT; 
        SELECT COUNT(nom_pays) INTO c FROM pays;
    (http://dev.mysql.com/doc/refman/5.0/...statement.html)

  5. #5
    Membre actif Avatar de elvan49
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 274
    Points : 204
    Points
    204
    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"

  6. #6
    Membre actif Avatar de elvan49
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 274
    Points : 204
    Points
    204
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
     #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"

  7. #7
    Membre actif Avatar de elvan49
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 274
    Points : 204
    Points
    204
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
     #1172 - Result consisted of more than one row
    à suivre...
    "n'imprimez ces messages que si nécessaire... Préservez notre planète"

  8. #8
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    le probleme vient du fait que ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom_pays INTO liste FROM pays;
    te renvoi plusieurs resultats.

    tu peux utiliser un curseur.

  9. #9
    Membre actif Avatar de elvan49
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 274
    Points : 204
    Points
    204
    Par défaut Dernière étape (...?...)
    Voici le code de procédure valide (en tout cas sans faute de syntaxe)
    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
    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"

  10. #10
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    essaye ça :
    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
     
    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

  11. #11
    Membre actif Avatar de elvan49
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 274
    Points : 204
    Points
    204
    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"

  12. #12
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    que veut tu que ça t'affiche ?

    si tu veux afficher i, essaye ça :

    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
     
    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 ;

  13. #13
    Membre actif Avatar de elvan49
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 274
    Points : 204
    Points
    204
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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"

  14. #14
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    j'ai trouvé ce lien

    j'espere que ça t'aidera

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

Discussions similaires

  1. Une erreur de syntaxe sous SqlServer? mais qui marche quand meme
    Par dzenakhra dans le forum Développement
    Réponses: 4
    Dernier message: 18/11/2008, 18h04
  2. [Conception] Je n'arrive pas créé une table,erreur de syntax mais laquel
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/09/2006, 08h11
  3. erreur de syntaxe, mais je ne vois pas
    Par Argorate dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/08/2006, 12h12
  4. [VB.Net] Pourquoi ai-je une erreur de syntaxe INSERT UPDATE ?
    Par zzzmoi dans le forum Accès aux données
    Réponses: 14
    Dernier message: 17/08/2006, 14h21
  5. Y aurait-il une erreur de syntaxe ?
    Par mpat dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 21/12/2005, 15h07

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