Script shell pour exécuter script sql avec variable
Bonjour,
Je tente de développer un petit script shell qui exécutera un script sql, contenant 400 requêtes utilisant toutes une variable commune : @siren.
Exemple de requête :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| delete ca
from cause_annulation ca
join ligne_commande lc on lc.id = ca.fk_ligne_commande
join entete_commande ec on ec.id = lc.fk_entete_commande
join type_ligne_commande_version tcv on tcv.id = lc.fk_type_ligne_commande_version
join type_ligne_commande tc on tc.id = tcv.fk_type_ligne_commande
join migration_gcblo mg on mg.fk_entete_commande = ec.id
where lc.code_offre = 'O00000000015'
and mg.fk_operateur = (select id from operateur where operateur_siren = @siren)
and mg.indicateur_migration_realisee = 1
and mg.indicateur_rejet = 0
and mg.code_operation = 'CSTR'
and tc.code = 'GCFTTX_REG'; |
Ce script doit utiliser Mysql, et initialiser un fichier de log.
Mon problème est le suivant : Si j'appelle juste mysql avec un script contenant une requête sans paramètre, ça fonctionne, et la requête est bien écrite dans mon fichier de log.
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
#!/bin/sh
echo Migration CSTR
#------------------------------------------------#
# -- VERIFICATION DEs PARAMETRES -- #
#------------------------------------------------#
echo "Nombre d'argument "$#
if [ $# -ne 1 ]; then
echo "ERREUR DANS LE NOMBRE DE PARAMETRES : Seul le SIREN est nécessaire"
else
echo "Le SIREN de l'opérateur à migrer est "$1
#------------------------------------------------#
# -- ALIMENTATION DES VARIABLES -- #
#------------------------------------------------#
SIREN=$1
FIC_SQL=/opt/mysql/sql/CSTR
SH_LOG=/opt/mysql/sql/CSTR/Logs
echo $SIREN
echo $FIC_SQL
echo $SH_LOG
#------------------------------------------------#
# -- DECLARATION DES FICHIERS -- #
#------------------------------------------------#
# FICHIER DE TRACE
FIC_TRACE=$SH_LOG/migration.trc
# FICHIER DE SCRIPT SQL
SCRIPT_SQL=$FIC_SQL/migration_cstr_gcblo1.sql
#------------------------------------------------#
# -- ON UTILISE MYSQL -- #
#------------------------------------------------#
touch $FIC_TRACE
set -x
mysql --user=pcol01update --password=pcol01update --host=localhost --database=pcol01 < $SCRIPT_SQL >> $FIC_TRACE
fi
exit 0 |
Par contre, si je rajoute juste une initialisation de variable à l'exécution du script, je n'ai plus rien dans les logs, et la requête n'a pas tourné :
Code:
1 2 3
| touch $FIC_TRACE
set -x
mysql --user=pcol01update --password=pcol01update --host=localhost --database=pcol01 -e "set @siren=$SIREN;"< $SCRIPT_SQL >> $FIC_TRACE |
C'est la première fois que j'utilise du shell, j'en appelle donc à votre expérience. :calim2:
Merci par avance
Ma solution, puis nouvelle question :)
Merci pour vos réponses.
Du coup j'ai opté pour une solution différente. Mon shell appelle un premier script sql : migration_cstr_gcblo1.sql. Ce script sert à appeler une multitude de scripts à la suite.
J'ai ajouté dans ce premier script l'initialisation de ma variable :
Code:
set @siren = SIREN_OP;
Puis dans mon shell, je remplace SIREN_OP par ma variable en entrée. J'appelle mon script, puis je remet mon premier script avec le générique SIREN_OP.
Code:
1 2 3 4 5 6
|
sed -i "s/SIREN_OP/${SIREN}/" $SCRIPT_SQL
// Traitement
sed -i "s/${SIREN}/SIREN_OP/" $SCRIPT_SQL |
Cette méthode fonctionne et répond à mon besoin.
Par contre, j'ai un autre problème. Le fichier que j'initialise, me sert à avoir des logs SQL de traitement. Seulement, seul le résultat des requête Select est noté dedans. Pour les update / insert / Delete, il n'y a rien. Existe t'il des options à activer ??
Encore une fois, merci par avance.