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 :

Creation Procedure : erreur sur une clause LIMIT


Sujet :

SQL Procédural MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut Creation Procedure : erreur sur une clause LIMIT
    Bonjour,

    Avec Mac OSX et mysql de MAMP (appli. apache, mysql ..) je cherche à créer une procédure dont le texte suit :

    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
    28
    29
    30
    31
    32
    33
    DELIMITER ;
    DROP PROCEDURE IF EXISTS Procedure_1;
    DELIMITER !!
    CREATE PROCEDURE Procedure_1 (date_debut DATE, date_fin DATE)
    BEGIN
    DECLARE variable_1 SMALLINT UNSIGNED DEFAULT 1;
    DECLARE variable_2 DATE;
    DECLARE variable_3 SMALLINT UNSIGNED DEFAULT 1;
    DECLARE variable_4 VARCHAR (64);
    DECLARE variable_5 SMALLINT UNSIGNED DEFAULT 1;
    DECLARE variable_6 SMALLINT UNSIGNED DEFAULT 1;
    TRUNCATE TABLE Table_1;
    TRUNCATE TABLE Table_2;
    SET variable_2 = date_debut;
    WHILE variable_2 < date_fin DO
    	TRUNCATE TABLE Table_2;
    	INSERT INTO Table_2 SELECT Ville FROM Base_Ville WHERE Base_Ville.date = variable_2 GROUP BY Ville;
    	SET variable_6 = 1;
    	SELECT COUNT(*) INTO variable_5 FROM Table_2;
    	WHILE variable_6 < variable_5 DO 	
    	SELECT Ville INTO variable_4 FROM Table_2 LIMIT 1 OFFSET variable_6;
    	SELECT MAX(Col_1) INTO variable_3 FROM Base_Ville WHERE date = variable_2 AND Ville = variable_4;
    		WHILE variable_1 < variable_3 DO
    			REPLACE INTO Table_1 SELECT * FROM Base_Ville WHERE Base_Ville.Col_1 = variable_1 AND Base_Ville.date = variable_2 AND Base_Ville.Ville = variable_4 ;
    			SET variable_1 = variable_1 + 1;
    		END WHILE;
    		SET variable_6 = variable_6 + 1;
    	END WHILE;
    	SET variable_1 = 1;
    	SET variable_2 = variable_2 + 1;
    END WHILE;
    END !!
    DELIMITER ;

    Que je rentre cette procedure directement dans le client texte (ligne à ligne par des copier-coller ou par :
    mysql > source ~/Procedure_1.txt

    Je recois la même erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'numero_ville;
    SELECT MAX(Col_1) INTO variable_3 FROM Base_Ville WHERE da' at line 18
    
    Si la ligne qui semble être en défaut est remplacée par la suivante, le résultat est le même :

    SELECT Ville INTO variable_4 FROM Table_2 LIMIT variable_6, 1;

    Par contre si je mets la suivante :

    SELECT Ville INTO variable_4 FROM Table_2 LIMIT 1, 1;

    La procedure est alors bien crée et lorsque testée, le résultat voulu (de cette procédure modifiée) est obtenu.

    Mais j'ai besoin de faire varier l'offset' de la clause LIMIT par une variable lors de l'exécution de la boucle.

    Quelqu'un saurait-il pourquoi le création de ma requete est rejetée. Et/ou quelqu'un sait-il comment résoudre ce problème.

    Par avance merçi.

  2. #2
    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 deja eu le meme probleme avec le LIMIT.
    Le problème c'est que le LIMIT n'accepte pas un offset variable.

    Du moins personne n'a encore pu me dire comment le faire marcher avec un offset variable.

  3. #3
    Membre actif Avatar de MANU_2
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 417
    Points : 275
    Points
    275
    Par défaut
    Je ne sais pas si ça répond à ta question mais ce code fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete2 = "SELECT * FROM msgpart, part WHERE msgpart.id_partX=id_part ORDER by nom_part LIMIT ".($nb_ligne_page*$num_page).",".$nb_ligne_page."";

  4. #4
    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
    a oui mais la tu passes par du php.

    Donc etant donné que php te construit ta requete, en fin de compte c'est comme si tu passais une constante.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Dans le pire des cas, selon ce que vous venez de me dire, comme j'utilise PERL pour le reste de mon application, je vais peut être utiliser PERL pour résoudre mon problème.

    Dommage, car je pense que cette méthode est beaucoup moins rapide qu'une procédure stocké.

    mais s'il n'y a pas moyen de faire autrement http://www.developpez.net/forums/ima...es/evilred.gif

  6. #6
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 494
    Points : 6 062
    Points
    6 062
    Par défaut
    Tu fais un curseur avec une condition qui va limiter le jeux de resultat. Le resultat tu le colle dans une table temporaire. Tu retournes la table temporaire.
    Inconvéniant c'est que la table doit être parcouru entièrement pour juste qu'une intervalle d'enregistrement au final.
    Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...

  7. #7
    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
    je comprend pas exactement :
    Tu fais un curseur avec une condition qui va limiter le jeux de resultat
    Mais si tu veux limiter avec un offset variable alors comment tu fais car le curseur n'acceptera pas non plus un LIMIT variable_6, 1

    Pourrais tu détailler le fond de ta pensée svp ?

    merci

  8. #8
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 494
    Points : 6 062
    Points
    6 062
    Par défaut
    En faite, il faut retirer le LIMIT. Il faut limiter le jeux de resultat dans la boucle du curseur. Via une variable qui s'incrémente.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SET incr = 0;
    SET pointeur = 20;
    SET nbRs = 10;
    -- mon curseur
    IF pointeur >= incr AND incr <= (nbRs+pointeur ) THEN  
      --enregistrement du data dans une table temporaire.
      SET incr = incr+1;
    END IF;
     
    -- select matable temporaire
    Un truc de ce genre, il y a peut être des erreurs mais en gros c'est ça
    Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Je n'ai encore jamais utilisé de pointeur dans mysql. Je remercie berceker united de me faire cette suggestion.

    Je vais l'essayée. Je sens que cela devrait répondre à ma question.

  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
    plutot bien touvé la solution échapatoire .

    merci berceker united

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut Considéré comme résolu
    J'ai défini aussi une autre solution :

    Dans la Table_2, j'ai ajouté un champ ('identifiant') qui est en 'auto-increment'

    Dés l'insertion chaque ligne va être numérotée.

    Ensuite, pour l'extraction daans le boucle il me suffit d'utiliser ce champ.

    Merçi à tous

  12. #12
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 494
    Points : 6 062
    Points
    6 062
    Par défaut
    J'ai pas trop compris ce que cela allait faire !
    Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Objectif :

    Dans la Table_2 j'ai plusieurs enregistrements dont je veux récupérer, un par un, le contenu du champ 'ville'.
    Et affecter ce contenu à la variable 'variable_4' pour utilisation dans une condition 'WHERE' d'un SELECT.

    Premiere tentative

    Lors de ma demande dans le forum, je cherchais à faire cette affectation par :

    SELECT Ville INTO variable_4 FROM Table_2 LIMIT 1 OFFSET variable_6;

    Mais comme LIMIT n'accepte pas d'OFFSET variable, je uis coincé.

    deuxiéme

    La lecture de tes propositions m'a donné l'idée (rien de génial là dedans) d'ajouter un champ 'identifiant' avec auto-increment dans la Table_2.
    Ainsi chaque enregistrement a un numéro de 1 à n.

    SELECT COUNT(*) INTO nb_ville FROM Table_2; # nombre de villes
    SET numero_ville = 1;
    WHILE numero_ville <= nb_ville DO
    SELECT Ville INTO variable_4 FROM Table_2 WHERE identifiant = numero_ville;

    ----- traitement ----

    SET numero_ville = numero_ville + 1;
    END WHILE;

  14. #14
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 494
    Points : 6 062
    Points
    6 062
    Par défaut
    Citation Envoyé par breuil Voir le message
    Objectif :

    Dans la Table_2 j'ai plusieurs enregistrements dont je veux récupérer, un par un, le contenu du champ 'ville'.
    Et affecter ce contenu à la variable 'variable_4' pour utilisation dans une condition 'WHERE' d'un SELECT.

    Premiere tentative

    Lors de ma demande dans le forum, je cherchais à faire cette affectation par :

    SELECT Ville INTO variable_4 FROM Table_2 LIMIT 1 OFFSET variable_6;

    Mais comme LIMIT n'accepte pas d'OFFSET variable, je uis coincé.

    deuxiéme

    La lecture de tes propositions m'a donné l'idée (rien de génial là dedans) d'ajouter un champ 'identifiant' avec auto-increment dans la Table_2.
    Ainsi chaque enregistrement a un numéro de 1 à n.

    SELECT COUNT(*) INTO nb_ville FROM Table_2; # nombre de villes
    SET numero_ville = 1;
    WHILE numero_ville <= nb_ville DO
    SELECT Ville INTO variable_4 FROM Table_2 WHERE identifiant = numero_ville;

    ----- traitement ----

    SET numero_ville = numero_ville + 1;
    END WHILE;
    Ok, je vois
    Si d'un selec tu récupères qu'une seul valeur tu n'as pas besoin de faire un into dans le select.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET mavariable = (SELECT * FROM maTable)
    Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    C'est mieux, merçi.

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

Discussions similaires

  1. [Server SQL 2000] Erreur sur une "stored procedure"
    Par hunteshiva dans le forum MS SQL Server
    Réponses: 17
    Dernier message: 18/03/2011, 15h41
  2. erreur sur une procedure plsql
    Par diane535 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 06/12/2006, 09h51
  3. Réponses: 4
    Dernier message: 14/06/2004, 16h18
  4. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00
  5. Réponses: 17
    Dernier message: 25/03/2003, 13h45

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