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 :

Requête SQL dynamique avec nom de table dans une variable


Sujet :

SQL Procédural MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Requête SQL dynamique avec nom de table dans une variable
    bonjour,

    J'utilise MySQL 5.0, et je cherche à créer une requête simple de manière dynamique dans une procédure stockée, en passant dans une variable le nom d'une table, et d'utiliser cette variable dans ma requête sql, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    BEGIN
         set @tblname="mydb.mytable";
         select * from @tblname;
    END
    Ce code ne fonctionne évidemment pas (erreur de syntaxe 1064), mais y a-t-il un autre moyen, alors?

    Merci.

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Il faut utiliser un prepared statement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BEGIN
    SET @tblname="mydb.mytable";
    SET @sql = CONCAT('select * from ', @tblname);
    PREPARE stmt FROM @sql ;
    EXECUTE stmt ;
    DEALLOCATE PREPARE stmt ;
    END
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut requête sql dynamique avec nom de table dans une variable
    Merci Antoun, ça marche impeccablement.

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    je parcours ce forum en quete de ma reponse et je pense que ce sujet pourrais y aqrriver.

    ce que je cherche a faire est du même style que jonjack sauf que ce qui est dynamique chez moi, ce sont les noms de champs.

    je recupere un nom dans une liste deroulante et ca devient mon nom de champs dans lequel je dois inserer ou modifier la valeur.

    dois-je utiliser le meme type de code ou puis-je appeler les champs dans la requete par leur numeros ?

    merci d'avance.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Numéros d'ordre à incrémenter / décrémenter
    Bonjour,

    Pardon de déterrer ce vieux sujet mais sa fait un moment que je galère sur google et ce poste est le seul qui m'apporte une réponse, a tel points qu'il m'a conduit à m'inscrire

    Je cherche à faire exactement la même chose, dans une procédure qui pourrai s'appliquer à plusieurs table, mais en vain, je suis pourtant également sur mysql 5 (5.0.51b simulé sur wamp pour être précis).

    Je fait bêtement sa, simplement pour tester pour l'instant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE PROCEDURE maProcedure()
    BEGIN
    DECLARE sqlCMD varChar(500);
    set sqlCMD =  CONCAT('select * from', 'matable');
    PREPARE stmt FROM sqlCMD;
    END
    ce qui me donne:
    #1064 - 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 'sqlCMD;
    END' at line 7
    si je fait juste PREPARE stmt FROM 'select * from matable', sa roule, mais sa sert a rien...j'ai l'impression que le problème vient que le lui file une variable apres le FROM, elle doit ètre d'un type particulié? sur le site de mysql, il dise juste a ce sujet que çe peut être une chaîne littérale, ou une variable utilisateur.


    Y'a pas une autre méthode que les prepared statement ?
    un coup demain sa serai cool, surtout que sa devient urgent. Merci d'avance!!

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Il faut utiliser des variables de session et non des variables locales (donc @sqlCMD au lieu de sqlCMD, et pas de DECLARE). Par ailleurs, un espace entre from et matable fera le plus grand bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE PROCEDURE maProcedure()
    BEGIN
    SET @sqlCMD =  CONCAT('select * from ', 'matable');
    PREPARE stmt FROM @sqlCMD;
    END
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    merci Antoun, c'était exactement ça, j'ai envie de me frapper .

  8. #8
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    Désolé de re-déterrer ce sujet mais encore une fois c'est le seul qui s'approche de ce que je souhaite faire.

    Je suis dans une fonction stockée et j'ai besoin d'exécuter une requête avec des clauses where différentes en fonction de certains paramètres passés à la fonction.

    J'ai donc utilisé vos astuces ci-dessus mais je me suis pris cette belle erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SQL Error 1336: Dynamic SQL is not allowed in stored function or trigger
    SQL:
    <code de ma fonction>
    Je précise avoir un serveur MySQL 5.1.41 sur un Ubuntu 10.04

    Que puis-je faire ?

    Merci d'avance
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  9. #9
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    Dans mon exemple précis j'ai ç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
    21
    22
    23
    24
    25
     
    SET @sql = 'SELECT COUNT(ca.id_child) INTO nb_unsubscr FROM t_calendar_school ca, t_child c WHERE ca.id_child = c.id_child AND sm_unsubscr_lunch = 1 AND WEEK(cs_date, 3) = pNoWeekYear AND YEAR(cs_date) = vYear';
     
     
    IF pClass <> 0 THEN
     
    	SET @sql = concat(@sql, ' AND c.id_class = pClass');
     
    END IF;
     
     
     
    IF pSex <> 0 THEN
     
    	SET @sql = concat(@sql, ' AND c.sex = pSex');
     
    END IF;
     
     
     
    IF pWeekDay <> 0 THEN
     
    	set @sql = concat(@sql, ' AND WEEKDAY(ca.cs_date) = pWeekDay');
     
    END IF;
    Auriez-vous une autre façon de faire ?

    Merci d'avance
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  10. #10
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    Bon du coup j'ai mis mon code avec le SQL dynamique dans une procédure que j'ai appelée dans ma fonction où le reste du code est fait.
    Cela "compile" (comprendre que MySQL Workbench ne me pète pas d'erreur à la gueule lorsque je clique sur Apply et qu'il enregistre bien ma nouvelle procédure en base... De la même façon il prend en compte les modifs faites sur la fonction dont j'ai hérité...)

    En revanche au moment où l'appli appelle la première fonction (celle qui appelle la procédure stockée contenant le SQL dynamique) et bien il me relance sa put*** d'erreur comme quoi le SQL dynamique n'est pas autorisé dans les fonctions stockées ou les triggers.

    Quelqu'un saurait comment je peux contourner ça svp ?

    Merci d'avance
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

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

Discussions similaires

  1. [2008R2] Recuperation nom de table dans une variable
    Par muzin dans le forum SSIS
    Réponses: 5
    Dernier message: 20/12/2013, 10h41
  2. Réponses: 5
    Dernier message: 10/02/2010, 14h11
  3. Réponses: 3
    Dernier message: 04/06/2007, 12h29
  4. [SQL] recherche de nom de table dans une BD
    Par benohit dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 15/09/2006, 14h54
  5. [SQL] Problème avec nombre d'enregistrements dans une table
    Par zana74 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 14/08/2006, 13h28

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