|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Candidat au titre de Membre du Club
![]() Nicolas Nicolas Haegelsteen Inscription : décembre 2011 Messages : 9 ![]() |
Bonjour à tous,
Voilà un petit problème à vous soumettre : J'ai un fichier sql, contenant une requête qui devra être appelée par plusieurs shells. Cette requête contient des variables. Ex: select * from table where champ = $var Dans les shells, je dois "envoyer" cette requête dans un pipe, puis l'exécuter. Le problème est que je n'arrive pas à remplacer les variables par leur valeur, déclarée dans le shell avant d'envoyer la requête dans le pipe. J'espère que vous pourrez m'aider Merci d'avance, Nicolas |
|
|
10
|
|
|
#2 | ||
|
Expert Confirmé Sénior
![]() francois Ingénieur systèmes et réseaux Inscription : juillet 2006 Messages : 3 538 ![]() |
probablement en faisant un truc du genre :
Code :
echo "commande sql "$valeur" where ..... "$variable" ; " | interpreteurSQL Code :
|
||
|
|
00
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() Nicolas Nicolas Haegelsteen Inscription : décembre 2011 Messages : 9 ![]() |
Ça c'est exactement ce que je faisais avant. Mais là, j'essaie de séparer la requête et le Shell.
Fichier.sql Fichier.sh Comment : 1. Déclarer les variables 2. Appeller le fichier sql pour que les variables dans la requête soient bien remplacées par leur valeur. J'espère que c'est plus clair |
|
|
01
|
|
|
#4 | ||||
|
Candidat au titre de Membre du Club
![]() Nicolas Nicolas Haegelsteen Inscription : décembre 2011 Messages : 9 ![]() |
En gros :
fichier.sql Code :
Code :
|
||||
|
|
01
|
|
|
#5 |
|
Expert Confirmé Sénior
![]() Inscription : février 2008 Messages : 2 071 ![]() |
Bonjour,
Le contenu des fichiers lus n'est pas sujet au développement des variables. Désolé. une solution : utiliser un fichier patron, le modifier avec sed, avec les variables ad'hoc, vers un fichier temporaire, et utiliser ce fichier temporaire, ou utiliser la sortie de sed ... ? |
|
|
20
|
|
|
#6 | ||||||
|
Candidat au titre de Membre du Club
![]() Nicolas Nicolas Haegelsteen Inscription : décembre 2011 Messages : 9 ![]() |
Arf! Il me semblait bien que ce n'était pas si simple...
Pour vous donner une idée du contexte, j'ai plusieurs shells différents qui doivent tourner sur des DB différentes mais de même structure, mais qui doivent exécuter la même requête à un moment ou l'autre, avec des variables différentes. Les shells sont sujets à modification, la requête aussi, mais je n'ai pas envie de devoir éditer une dizaine de shells à chaque fois que la requête change...L'idée d'avoir un fichier sql séparé, c'est surtout pour pouvoir éditer la requête dans un éditeur adhoc avec un highlight correct de la syntaxe. Et si je fais quelque chose comme ceci, puisque si je ne me trompe, si on appelle un shell et non un fichier txt ou sql, les variables passent... fichier01.sql Code :
Code :
Code :
Merci d'avance, -N |
||||||
|
|
01
|
|
|
#7 |
|
Expert Confirmé Sénior
![]() Inscription : février 2008 Messages : 2 071 ![]() |
tu ne peux pas sourcer un fichier de commandes sql dans un interpréteur de commandes : il ne va pas comprendre le contenu du fichier tel qu'il le devrait être.
|
|
|
10
|
|
|
#8 |
|
Candidat au titre de Membre du Club
![]() Nicolas Nicolas Haegelsteen Inscription : décembre 2011 Messages : 9 ![]() |
Damned! Je suis donc fait comme un rat...
Il ne me reste plus qu'à faire des .sh contenant les requêtes... Mais j'avoue que ça ne me plait pas des masses Et si je crée un shell qui construit un shell temporaire contenant la requête, puis qui l'efface après que je l'ai appelé dans mon shell d'origine? |
|
|
10
|
|
|
#9 | ||
|
Expert Confirmé Sénior
![]() Inscription : février 2008 Messages : 2 071 ![]() |
utilise une fonction :
Code :
|
||
|
|
10
|
|
|
#10 | |||||
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
Citation:
J'ai pas tout lu en détail (peut-être aurais-je du) mais à quoi sert la variable "sql" de ta fonction ??? Ou plus simple: pourquoi copier des variables dans d'autres ??? Code :
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|||||
|
|
10
|
|
|
#11 | |||
|
Expert Confirmé Sénior
![]() Inscription : février 2008 Messages : 2 071 ![]() |
Citation:
Citation:
Citation:
|
|||
|
|
10
|
|
|
#12 |
|
Candidat au titre de Membre du Club
![]() Nicolas Nicolas Haegelsteen Inscription : décembre 2011 Messages : 9 ![]() |
Je vais essayer de clarifier alors
J'ai : - 10 bases de données - une vingtaine de shells - une vingtaine de requêtes Plusieurs shells différents peuvent appeler les mêmes requêtes, ou inversement un shell peut utiliser plusieurs requêtes différentes en fonction de ce que j'ai besoin de faire. L'idée, pour "simplifier" et organiser tout ça, est de séparer les requêtes des shells, histoire de ne pas finir avec plusieurs centaines de shells, et de pouvoir faire un changement éventuel à un seul emplacement, dans un seul fichier. Un dossier contenant les shells, et un contenant les requêtes. La difficulté vient de ce que j'aimerais avoir les requêtes dans des fichiers blabla.sql (extension qui me permet de les modifier dans un éditeur ad hoc, avec un highlight de la syntaxe. Ces requêtes sont relativement longues (jusqu'à une dizaine de join en tout genre, et au moins autant de variables). Comment dans un shell, appeler un fichier sql, et exécuter la requête tout en ayant remplacé les variables par leur valeur... J'espère que c'est plus clair Je n'ai aucun problème par contre, à passer par un shell intermédiaire qui transformerait le fichier sql en fichier sh par exemple. Dans les posts plus haut, la variable $sql servait à identifier le bon fichier sql |
|
|
10
|
|
|
#13 | ||||||
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
Citation:
Mouais. En fait tu cherches à séparer les choses. Un peu comme en MVC... Bon, à la base, il n'y a rien qui t'interdise de donner une extension ".sql" à un script shell. C'est pas super propre mais c'est permis. Ca pourrait donc te simplifier certaines choses. Tu pourrais par exemple intégrer la fonction de N_BaH dans tes scripts "sql" que tu appellerais depuis ton shell. Ou mieux, tu peux écrire tes fonctions shells dans des scripts ".sql" que tu sourceras dans tes scripts shells. Ainsi ces derniers connaitront lesdites fonctions qu'ils pourront appeler. Exemple toto.sql Code bash :
script_principal.sh Code bash :
Toutefois cela reste pas super propre. Un ".sql" étant sensé contenir une requête et non un script. Autre possibilité: envoyer directement tes fichiers sql dans mysql. Après-tout, mysql attend une requête. Que cette requête vienne d'un echo ou d'un fichier, quelle importance ??? Exemple: toto.sql Code bash :
select ch1, ch2, ch3 from table where champ1 = valeur;
script.sh Code bash :
cat toto.sql |mysql -u francois -p perso -h undertaker Citation:
Toutefois je ne vois pas trop comment créer des sql avec des variables. Tu parles d'éditeur highligh donc je présume qu'il s'agit d'un éditeur sql. Donc qui demande une syntaxe sql. Et dans ce genre de syntaxe, il n'y a pas de place pour des variables... Ou alors tu écris ton propre interpréteur. 1) des fichiers sql écrits dans une syntaxe propriétaire intégrant la notion de variable Exemple toto.sql 2) un programme chargé de convertir le sql propriétaire en sql standard Code bash :
traducteur.sh toto.sql "ch1, ch2, ch3" "table" "champ1 = valeur" |mysql -u francois -p perso -h undertaker "select ch1, ch2, ch3 from table where champ1 = valeur;". Toutefois, pour ce travail, je conseillerais un langage un poil plus puissant que le shell (comme par exemple Python)...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
||||||
|
|
10
|
|
|
#14 |
|
Nouveau Membre du Club
![]() Inscription : août 2007 Messages : 47 ![]() |
Question bête mais je ne vois pas la précision qui me semble primordiale pour le pb en question...
C'est une base de quel éditeur ? Oracle ? DB2 ? SQLServer ? etc... Il y a bien des réponses avec MySql mais le propriétaire du post ne mentionne rien à ce sujet... Autant avec Oracle et du shell Unix/Linux je le fais sans pb autant en DB2 il me semble que ce n'est pas possible, ou alors en générant un fichier sql dynamiquement via le shell... Cordialement |
|
|
01
|
|
|
#15 |
|
Candidat au titre de Membre du Club
![]() Nicolas Nicolas Haegelsteen Inscription : décembre 2011 Messages : 9 ![]() |
C'est une base Sybase IQ
Mais personnellement, je ne pense pas que cela change grand chose... Le noeud du problème c'est de savoir comment je pourrais appeler un fichier sql dans un shell, tout en lui passant les variables avant de l'exécuter. Je remets les mains dedans demain matin... et je vais tester deux ou trois trucs |
|
|
10
|
|
|
#16 |
|
Membre confirmé
![]() Développeur informatique Inscription : octobre 2006 Messages : 181 ![]() |
Un script sql avec des parametre identifiable ex : ==P1== ==P2== ...
et un petit sed ,awk ou autre pour traduire avant le pipe ... |
|
|
01
|
|
|
#17 |
|
Nouveau Membre du Club
![]() Inscription : août 2007 Messages : 47 ![]() |
Oui en gros mon "sql dynamique" généré via un script
@eomer: si il y a une importance, sous DB2 il est possible de lancer un .sql mais pas de lui passer un paramètre me semble t-il, j'ai cherché pas mal de temps sans trouver sur un projet pour me rabattre sur du sql dynamiquement généré. Sous Oracle je le fais couramment et Sybase je ne connais pas... Au passage je viens de voir qu'il était possible de placer "d'accord" / "pas d'accord" mais au minimum pour faire avancer le "chmilblique" ceux qui placent des "pas d'accord" donnez vos solutions! C'est un forum d'entraide ou je me suis gouré ??? |
|
|
11
|
|
|
#18 |
|
Membre confirmé
![]() Développeur informatique Inscription : octobre 2006 Messages : 181 ![]() |
+1 , d'accord avec toi, les votes devraient etre publiquement nominatifs ( ils le sont "secretement" déjà puisqu'on peut ensuite changer de vote ... )
|
|
|
10
|
|
|
#19 |
|
Expert Confirmé Sénior
![]() francois Ingénieur systèmes et réseaux Inscription : juillet 2006 Messages : 3 538 ![]() |
faudrait surtout qu'il soit justifiés par un petit texte genre 100 caractères ... pour pouvoir "voter" en justifiant par "inapproprié/hors sujet/faux/super idée/parfait/merci/etc...etc..."
|
|
|
10
|
|
|
#20 | ||||||
|
Candidat au titre de Membre du Club
![]() Nicolas Nicolas Haegelsteen Inscription : décembre 2011 Messages : 9 ![]() |
Bon, je n'avais pas abandonné le sujet... mais je cherchais.
Pour le moment, j'ai trouvé une solution qui me satisfait, mais qui me parait tellement simple que j'ai la vague impression de m'être mal exprimé en posant ma question... shell principal : test.sh Code :
Code :
résultat : quer.txt Code :
@2beornot2be: Par contre, je suis très intéressé par ton sql dynamique. Y'a un exemple, tuto, post là dessus? |
||||||
|
|
10
|
Copyright © 2000-2012 - www.developpez.com