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 :

problème sql syntax


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Par défaut problème sql syntax
    j'ai créé cette procédure stockée pour faire une recherche depuis un textBox avec un string qui a un format "pol/dury/".

    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 'TABLE'(idsociete INT, nomSociete varchar(50), dateCreSociete DATETIME, tvaSociet' at line 11

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    CREATE DEFINER = CURRENT_USER PROCEDURE `GetSociete`(
            IN SearchSociete VARCHAR(50),
            INOUT HowManyResults INTEGER
        )
        NOT DETERMINISTIC
        CONTAINS SQL
        SQL SECURITY DEFINER
        COMMENT ''
     
    BEGIN
    	DECLARE societeTemp TABLE (idSociete INT, nomSociete VARCHAR(50), dateCreSociete DATETIME, tvaSociete VARCHAR(30));
    	DECLARE search VARCHAR(50);
        DECLARE position INT;
        DECLARE word VARCHAR(30);
     
        /* searchSociete est une chaine reçu qui peut avoir plusieurs mots séparés par '/' 
        exemple: pol/dury/   */
     
        set search = `SearchSociete`;
        /*donne la position d'ou se trouve le caractère spécial*/
        set position = LOCATE('/', search);
     
        /*boucle tant qu'il y a ce caractère dans la chaine*/
        WHILE LOCATE('/', search) DO
     
        /*donne la position ou on se trouve avant le caractère spécial*/ 
        set position = position - 1;
        /*affecte word au mot a gauche séparé par '/' */
        set word = LEFT(search, position);
     
        /*remplit la table temporaire */
        insert into societeTemp select * from `sct`
        where nom like '%word%' or sct_num_tva like '%word%';
     
        /*donne la position ou on se trouve après le caractère spécial*
        set position = position + 2;
        /*assigne search avec la valeur de la chaine qui se trouve à droite du caractère '/' */
        set search = SUBSTRING(search, position);
     
        end while;
     
        SELECT HowManyResults = COUNT(*)FROM societeTemp;
        /* renvoie le réusltat*/
        SELECT * FROM societeTemp;
     
    END;
    merci de votre aide car sans ça je suis bloqué

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    MySQL n'accepte que des types scalaires, et donc pas le type TABLE. La solution pour toi est de faire un CREATE TEMPORARY TABLE societeTemp à la place du DECLARE societeTemp.

    Par ailleurs, un peu plus bas tu utilises des `accents graves` à la place des 'apostrophes'.

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Par défaut
    J'ai l'habitude d'utiliser sql server et là c'est permis, merci à toi.
    J'ai désormais une autre erreur :


    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 'Declare search varchar(50); declare position int; declare word varchar(30)' at line 11

    Je ne vois pas où j'ai une erreur là car dans la documentation de chez mysql c'est bien comme ça qu'on fait.

    Aurais tu une idée pour m'aider à terminer cette procédure stockée

    merci

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    POSITION est un mot réservé, il n'est pas impossible que SEARCH et WORD le soient aussi.

    Si ça ne règle pas ton problème, merci de poster la dernière version de ton code.

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Par défaut
    J'ai changé tous les mots qui auraient pu être réservé mais j'ai toujours la même erreur ligne 11.

    voici le code changé, pour information j'utilise EMS SQL Manager 2007 Lite for MySQL

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
     
    CREATE DEFINER = CURRENT_USER PROCEDURE `new_proc`(
            IN SearchSociete VARCHAR(50),
            OUT HowManyResults INTEGER(11)
        )
        NOT DETERMINISTIC
        CONTAINS SQL
        SQL SECURITY DEFINER
        COMMENT ''
    BEGIN
    	CREATE TEMPORARY TABLE societeTemp (idSociete INT, nomSociete VARCHAR(50), dateCreSociete DATETIME, tvaSociete VARCHAR(30));
    	DECLARE rech VARCHAR(50);
        DECLARE pos INT;
        DECLARE mot VARCHAR(30);
     
        /* searchSociete est une chaine reçu qui peut avoir plusieurs mots séparés par '/' 
        exemple: pol/dury/   */
     
        set rech = 'SearchSociete';
        /*donne la position d'ou se trouve le caractère spécial*/
        set pos = LOCATE('/', rech);
     
        /*boucle tant qu'il y a ce caractère dans la chaine*/
        WHILE LOCATE('/', rech) DO
     
        /*donne la position ou on se trouve avant le caractère spécial*/ 
        set pos = pos - 1;
        /*affecte word au mot a gauche séparé par '/' */
        set mot = LEFT(rech, pos);
     
        /*remplit la table temporaire */
        insert into societeTemp select * from 'sct'
        where nom like '%mot%' or sct_num_tva like '%mot%';
     
        /*donne la position ou on se trouve après le caractère spécial*/
        set pos = pos + 2;
        /*assigne search avec la valeur de la chaine qui se trouve à droite du caractère '/' */
        set rech = SUBSTRING(rech, pos);
     
        end while;
     
        SELECT HowManyResults = COUNT(*)FROM societeTemp;
        /* renvoie le réusltat*/
        SELECT * FROM societeTemp;
     
    END;
    Merci

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Par défaut
    j'ai trouvé l'erreur, c'était en fait que le declare des variables doit être juste après le BEGIN et avec la CREATE TEMPORARY TABLE. Le problème n'est malheureusement pas fini car j'ai maintenant une autre erreur.

    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 'sct'
    where sct_nom like '%$mot%' or sct_num_tva like '%$mot%';
    */d at ligne 31 (end while


    J'ai testé le where avec et sans $ mais rien n'y change.

    merci des propositions

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Par défaut erreur 1054 unknown colum
    J'ai une procédure stockée qui est appelée depuis une application web (asp.net en C# sous visual studio 2008).
    Lorsque je fais ma recherche, j'ai cette exception 1054 levée, voici la procédure stockée en question:
    De plus quand j'exécute la procedure dans EMS SQL manager for MySQL et que je donne une valeur au paramètre qui est dans ma table, il ne me donne aucun résultat

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    CREATE DEFINER = 'root'@'localhost' PROCEDURE `SearchSociete`(
            IN SearchString VARCHAR(50)
        )
        NOT DETERMINISTIC
        CONTAINS SQL
        SQL SECURITY DEFINER
        COMMENT ''
    BEGIN
    		DECLARE rech VARCHAR(50);
        DECLARE pos INT;
        DECLARE mot VARCHAR(30);
    	CREATE TEMPORARY TABLE societeTemp (idSociete INT, nomSociete VARCHAR(50), dateCreSociete DATETIME, tvaSociete VARCHAR(30));
     
        /* searchSociete est une chaine reçu qui peut avoir plusieurs mots séparés par '/'
        exemple: pol/dury/   */
     
        set rech = `SearchString`;
        /*donne la position d'ou se trouve le caractère spécial*/
        set pos = LOCATE('/', rech);
     
        /*boucle tant qu'il y a ce caractère dans la chaine*/
        WHILE LOCATE('/', rech) DO
     
        /*donne la position ou on se trouve avant le caractère spécial*/
        set pos = pos - 1;
        /*affecte word au mot a gauche séparé par '/' */
        set mot = LEFT(rech, pos);
     
        /*insert into societeTemp remplit la table temporaire or sct_num_tva like `%mot%`*/
        select * from `sct`
        where sct_nom like `mot%` ;
     
        /*donne la position ou on se trouve après le caractère spécial*/
        set pos = pos + 2;
        /*assigne search avec la valeur de la chaine qui se trouve à droite du caractère '/' */
        set rech = SUBSTRING(rech, pos);
     
        end while;
     
        /*SELECT HowManyResults = COUNT(*)FROM societeTemp;*/
        /* renvoie le réusltat*/
        SELECT * FROM societeTemp;
     
    END;
    Si Quelqu'un a une solution elle est bienvenue

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    Il ne faut pas que tu utilises les accents graves pour les chaînes, ni les apostrophes pour des noms de variables !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SET rech = SearchString ;
    (...)
        SELECT * FROM `sct`
        WHERE sct_nom LIKE CONCAT(mot, '%') ;

  9. #9
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Par défaut
    merci de toutes tes réponses.

    J'ai testé le changement mais quand j'exécute ma procédure stockée sous EMS SLS Manager for MySQL et que je lui donne une valeur de paramètre qui existe dans ma table, il me dit qu'il n'y a aucun résultat.

    Existe-t-il un pas à pas ou aurais tu une idée?

    merci

  10. #10
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    Est-ce qu'il ne faudrait pas décommenter le INSERT INTO ici ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    /*insert into societeTemp remplit la table temporaire or sct_num_tva like `%mot%`*/
        SELECT * FROM `sct`
        WHERE sct_nom LIKE CONCAT(mot, '%) ;
    Sinon, pour faire du pas à pas, tu insères tes infos de debug au fur et à mesure dans une table temporaire.

  11. #11
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Par défaut
    J'ai bien tiré l'insert du commentaire mais toujours pas de résultats retournés.
    Est ce que tu aurais un tuto ou autre qui montre comment

    insèrer les infos de debug dans une table temporaire pour faire le pas à pas.

    Merci

Discussions similaires

  1. Problème de syntaxe pour fichier SQL
    Par savior dans le forum SQL
    Réponses: 12
    Dernier message: 13/09/2006, 13h33
  2. Problème de Syntaxe SQL (Update Table)
    Par Thibaut_Dupont dans le forum Access
    Réponses: 15
    Dernier message: 17/07/2006, 16h32
  3. problème de syntaxe delphi pour une requête sql
    Par socooooool dans le forum Bases de données
    Réponses: 12
    Dernier message: 07/07/2006, 16h53
  4. [SQL][REQUETE] problème de syntaxe
    Par Stender dans le forum Access
    Réponses: 4
    Dernier message: 02/03/2006, 21h02
  5. [Interbase] Problème de syntaxe SQL
    Par navis84 dans le forum InterBase
    Réponses: 4
    Dernier message: 22/12/2004, 17h07

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