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/01/2007, 01h03   #1
Invité de passage
 
Inscription : janvier 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 2
Points : 1
Points : 1
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 :
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.
jonjack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2007, 06h16   #2
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Il faut utiliser un prepared statement :
Code :
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 SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2007, 10h45   #3
Invité de passage
 
Inscription : janvier 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 2
Points : 1
Points : 1
Par défaut requête sql dynamique avec nom de table dans une variable

Merci Antoun, ça marche impeccablement.
jonjack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2007, 09h57   #4
Invité de passage
 
Inscription : avril 2007
Messages : 1
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 1
Points : 1
Points : 1
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.
CptNemo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2009, 19h02   #5
Invité de passage
 
Inscription : juin 2009
Messages : 9
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 9
Points : 2
Points : 2
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 :
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:
Citation:
#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!!
Splyf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2009, 23h09   #6
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
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 :
1
2
3
4
5
CREATE PROCEDURE maProcedure()
BEGIN
SET @sqlCMD =  CONCAT('select * from ', 'matable');
PREPARE stmt FROM @sqlCMD;
END
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2009, 15h50   #7
Invité de passage
 
Inscription : juin 2009
Messages : 9
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 9
Points : 2
Points : 2
merci Antoun, c'était exactement ça, j'ai envie de me frapper .
Splyf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 08h56   #8
Membre régulier
 
Avatar de magicbisous-nours
 
Inscription : octobre 2005
Messages : 201
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 201
Points : 82
Points : 82
Envoyer un message via MSN à magicbisous-nours
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 :
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]

une pétition pour la libération des drivers matériels ici
J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source
magicbisous-nours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 09h25   #9
Membre régulier
 
Avatar de magicbisous-nours
 
Inscription : octobre 2005
Messages : 201
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 201
Points : 82
Points : 82
Envoyer un message via MSN à magicbisous-nours
Dans mon exemple précis j'ai ça :
Code :
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]

une pétition pour la libération des drivers matériels ici
J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source
magicbisous-nours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 14h37   #10
Membre régulier
 
Avatar de magicbisous-nours
 
Inscription : octobre 2005
Messages : 201
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 201
Points : 82
Points : 82
Envoyer un message via MSN à magicbisous-nours
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]

une pétition pour la libération des drivers matériels ici
J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source
magicbisous-nours 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 01h18.


 
 
 
 
Partenaires

Hébergement Web