Pages : 1
#1 Le 01/12/2023, à 18:00
- zigroful1
Mysql et noms de variables composés
Bonjour,
Je suis débutant dans mysql et je bute sur le problème suivant:
J'ai créé une base de données nommée Bdd_essai et une table t_Bdd_essai . Lorsque je me connecte à la base de données à partir du terminal et que j'affiche ma table, tout se passe bien.
Je souhaite, dans un deuxième temps, accéder à ma table à partir d'un script sql que je lance de l'invite ubuntu.
J'ai créé le fichier sql suivant, que j'ai nommé essaiScriptSql.sql
set @var1='Bdd_';
set @var2='essai';
@table1=concat('t_',@var1,@var2)
select * from @table1
et je me connecte à partir de la ligne de commande ubuntu avec:
mysql -u XXX -p Bdd_essai < essaiScriptSql.sql
Je reçois un message d'erreur:
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 '@table1' at line 1
NB J'ai volontairement décomposé le nom de ma base de données car j'ai besoin de faire varier ce nom ultérieurement et ne souhaite pas devoir le retaper entièrement. Je le recompose avec concat .
Quelqu'un a-t-il rencontré ce problème et cette diffiiculté quelque part ? Pourquoi ne peut-on pas recomposer un nom de Bdd ou de table comme on le ferait pour une variable dans BASH (par exemple) ou dans python ?
Hors ligne
#2 Le 02/12/2023, à 11:08
- zigroful1
Re : Mysql et noms de variables composés
Pardon, je corrige mon précédent post auquel j'ai corrigé un set et un point-virgule que j'avais oubliés en 3ème ligne, et ajouté un select @table1, pour m'assurer que la variable table1 contient bien la concaténation de t_ de Bddçet de essai. Vérification faite, tout est bon, et pourtant j'ai tjs cette erreur 1064 ! Je vous redonne le script corrigé:
set @var1='Bdd_';
set @var2='essai';
set @table1=concat('t_',@var1,@var2);
select @table1;
select * from @table1
Hors ligne
#3 Le 02/12/2023, à 11:38
- iznobe
Re : Mysql et noms de variables composés
Bonjour , question bete , mais ces lignes :
set @var1='Bdd_';
set @var2='essai';
@table1=concat('t_',@var1,@var2)
c ' est du langage SQL ? m ' etonnerait beaucoup .
De plus c ' est quoi l' interet de vouloir concatener des variables ?
tu n' as qu ' à directement definir tes variables comme tu en as besoin ( si toutefois tu en as besoin plus tard dans ton script ) , sinon autant directement ecrire la selection de la table correctement des le départ sans variable et en langage SQL bien sur .
Dernière modification par iznobe (Le 02/12/2023, à 11:45)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#4 Le 02/12/2023, à 11:52
- zigroful1
Re : Mysql et noms de variables composés
Oui c'est du SQL mais mon post#2 corrige le premier : la troisième ligne devient:
set @table1=concat('t_',@var1,@var2);
et la 4ème ligne de mon listing du post#2 m'affiche bien pour @table1 la chaîne de caractères : t_Bdd_essai , preuve que la concaténation des chaînes de caractères se déroule bien. Mais le problème semble venir de la 5ème ligne de mon post#2. Apparemment il ne reconnait pas ma table t_Bdd_essai qui pourtant existe bien!
Hors ligne
#5 Le 02/12/2023, à 11:59
- iznobe
Re : Mysql et noms de variables composés
Admettons , mais ca n' a pas d' interet de faire de la concatenation de variable , c ' est ce sompliquer la vie pour pas grand chose .
Autant definir les variables directement , si vraiment tu as besoin de definir ces variables . ca n ' a generalement pas d' interet sauf si tu utilises plus tard et plusieurs fois dans ton script .
Generalement une fois qu ' on est connecté a la table , on s' amuse pas a modifier les données de connexion a tout bout de champ .
D ' apres l' erreur :
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 '@table1' at line 1
ca dit qu ' il y a une erreur de syntaxe a la ligne 1 et pres de " @table1 "
As tu essayer de mettre , par exemple :
set @table1='concat('t_',@var1,@var2)';
pour dire que le resultat de la concatenation est a interpreter ensuite comme une chaine de caractère .
Dernière modification par iznobe (Le 02/12/2023, à 12:02)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#6 Le 02/12/2023, à 12:26
- zigroful1
Re : Mysql et noms de variables composés
En effet, je pourrai définir le nom de ma Bdd et de ma table à chaque fois . Mais les noms de mes tables extraites de la Bdd (je souhaiterai en extraire plusieurs, comme des vues) sont composés d'un "t_" suivi du nom de la Bdd suivi de _vw" et d'un numero de vue, tout ça pour identifier plus tard de quelle base de données j'ai extrait chaque vue! Si je ne compose pas le nom de chaque table, je serai obligé à chaque création de vue, de répéter t_Bdd_.......vw. C'est casse-pied !
Mais peut-être que je m'y prends mal et qu'il y a une astuce ?
J'ai essayé se mettre des simples quotes comme tu me l'as suggéré, mais ça ne marche tjs pas ! même erreur; Et pourtant quand je tape chaque ligne de mon script directement sur l'invite de mysql, tout se passe bien et j'arrive à afficher ma table
Hors ligne
#7 Le 02/12/2023, à 12:45
- bruno
Re : Mysql et noms de variables composés
#2 il manque toujours un point virgule pour terminer la dernière instruction.
La ligne :
select @table1;
n'a pas de sens pour moi. Peut-être voulais-tu sélectionner la base de données et dans ce cas c'est :
use Bdd_essai;
J'ai mis le noim de la base de données car cela ne fonctionnera pas avec une variable. Le mieux a tous points de vue est de sélectionner la base de données au moment de la connexion à MySQL.
#8 Le 02/12/2023, à 12:59
- iznobe
Re : Mysql et noms de variables composés
#2 il manque toujours un point virgule pour terminer la dernière instruction.
je sais meme pas comment j ' ai pu passer a coté de ca ...
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#9 Le 02/12/2023, à 15:08
- zigroful1
Re : Mysql et noms de variables composés
La ligne select @table1; est là juste pour afficher le contenu de la variable @table1 après concaténation et m'assurer qu'elle contient bien l'assemblage t_Bdd_essai.
Regarde le post #1, deuxième fenêtre à fond noir : quand je lance mysql j'indique bien une connection à ma base de donnée Bdd_essai et il se connecte bien à cette base de données. Mais je ne comprends pas pourquoi le fait de concaténer le nom de ma variable désignant le tableau t_Bdd_essai et de lui demander de m'afficher ce tableau par :
select * from @table1;
ne fonctionne pas ! Pourtant @table1 contient bien la chaine t_Bdd_essai et le tableau existe bien !!! (NB J'ai mis les points-virgules partout où ils manquaient !)
Hors ligne
#10 Le 02/12/2023, à 15:45
- bruno
Re : Mysql et noms de variables composés
Bah, moi n on plus je ne sais pas lire :
select * from @table1;
ne peut pas fonctionner avec une variable. Ce que tu veux faire c'est du SQL dynamique (je te laisse faire des recherches, je ne suis pas spécialiste du tout du SQL)
Pour que cela fonctionne il faut utiliser un requête préparée :
set @var1='Bdd_';
set @var2='essai';
set @table1=concat('t_',@var1,@var2);
select @table1;
set @my_query=concat('select * from ',@table1);
prepare statement from @my_query;
execute statement;
deallocate prepare statement;
#11 Le 02/12/2023, à 16:13
- zigroful1
Re : Mysql et noms de variables composés
Merci Bruno !
Grâce aux lignes que tu as rajoutées, ça fonctionne !
Je me heurtais donc à un problème de SQL dynamique alors que je débute tout juste les bases de données ! ça m'apprendra à jouer à la grenouille qui veut se faire aussi grande que le boeuf !
Bref! je te remercie ! Je vais essayer d'approfondir ! Mais je me demande comment j'aurais pu trouver dans la doc ce qui correspond à mon problème que je ne sais pas identifier ni nommer ! Les codes d'erreur de mysql sont trop sybillins !
Hors ligne
#12 Le 02/12/2023, à 16:25
- jplemoine
Re : Mysql et noms de variables composés
Bon avec une table users de la base zabbix.
Contenu de test.sql
set @var1='us';
set @var2='ers';
set @table1=concat(@var1,@var2);
select @table1;
set @s=concat('select * from ', @table1);
select @s;
PREPARE stmt from @s;
EXECUTE stmt;
Lancement par
mysql -u root -p zabbix < test.sql
En fait, il faut passer par un PREPARE pour "calculer" la requête --> le résultat interprété va dans une "zone" stmt (statement).
Puis on execute ce qu'il y a dans stmt
Ce compte ne servira plus : vous pouvez le supprimer si le coeur vous en dit...
Laissé par l'auteur pour historique.
Hors ligne
Pages : 1