OVH Cloud OVH Cloud

[WD75][MYSQL] exécution de requète

7 réponses
Avatar
jacques trepp
bonjour,
existe-t-il avec l'acces alter natif, une commande pour exécuter un fichier
.SQL , dans le genre de la commande HExécuteRequèteSql ?

merci

--
Jacques TREPP
AlbyGest
jacques.trepp_pasdespam@free.fr
enlever _pasdespam pour me joindre

7 réponses

Avatar
Manu
> existe-t-il avec l'acces alter natif, une commande pour exécuter un
fichier .SQL , dans le genre de la commande HExécuteRequèteSql ?



Je parle pour oracle mais il doit en etre de même pour les autres : non
cette fonction n'existe pas.

Par contre elle peut etre facilement mise en oeuvre, il faut extraire les
chaines (extraitchaine) avec comme séparateur le ; (séparateur SQL) depuis
un fichier texte (tu le mets dans une méga chaine de caractère). Pour toutes
ces chaines il faut lancer mySQLExec().

Je pense avoir donné assez de billes ;-)

Si c'est urgent, peux-tu faire un draft de la méthode et on l'intègre dans
les accès natifs, sinon je commence à y travailler ce soir.

--
Emmanuel
Avatar
Roumegou
Manu avait énoncé :
existe-t-il avec l'acces alter natif, une commande pour exécuter un
fichier .SQL , dans le genre de la commande HExécuteRequèteSql ?



Je parle pour oracle mais il doit en etre de même pour les autres : non
cette fonction n'existe pas.

Par contre elle peut etre facilement mise en oeuvre, il faut extraire les
chaines (extraitchaine) avec comme séparateur le ; (séparateur SQL) depuis
un fichier texte (tu le mets dans une méga chaine de caractère). Pour toutes
ces chaines il faut lancer mySQLExec().

Je pense avoir donné assez de billes ;-)

Si c'est urgent, peux-tu faire un draft de la méthode et on l'intègre dans
les accès natifs, sinon je commence à y travailler ce soir.



Dans mes fonctions SQl, j'ai la procédure ExecBatchScript. Si cela peut
vous aider.
FONCTION ExecBatchScript(pScript)
lignelue,commande est chaîne
res est un booléen
IdFichier est un entier
PasGlop est un booléen
i,nbmaj est un entier
msgRet est chaîne
codret est un entier
retCode est un booléen
nbmaj=0
msgRet=""

StartChrono()
IdFichier=fOuvre(pScript,foLecture)
fSQL:SetAutoCommit(False, 1)
retCode = fSQL:mySQLTransaction((fSQL:mySQLDebut), 1)
PasGlopúux
lignelue = fLitLigne(IdFichier)
// Autres lignes à lire ? Erreur de lecture ?
TANTQUE lignelue <> EOT ET lignelue <> ""
commande=TronqueDernierCaractere(lignelue) //enlève le ;
retCode = fSQL:mySQLExec(commande, 1)
SI PAS retCode ALORS
PasGlop=Vrai
FIN
fSQL:mySQLFerme(1)
nbmaj++
// Lecture des lignes suivantes du fichier
lignelue = fLitLigne(IdFichier)
FIN //TANTQUE LigneLue <> EOT ET LigneLue <> ""
resÿerme(IdFichier)


SI PasGlop ALORS
//SQLTransaction(sqlAnnule)
fSQL:mySQLTransaction((fSQL:mySQLAnnule), 1)
msgRet="Erreur execution script SQL : Transaction annulée"
SINON
//SQLTransaction(SQLFin)
fSQL:mySQLTransaction((fSQL:mySQLFin), 1)
msgRet=nbmaj+" Script executé avec succès"+RC+StopChrono()
FIN
RENVOYER msgRet

--
Eric Roumégou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
jacques trepp
Roumegou wrote:
Manu avait énoncé :
existe-t-il avec l'acces alter natif, une commande pour exécuter un
fichier .SQL , dans le genre de la commande HExécuteRequèteSql ?



Je parle pour oracle mais il doit en etre de même pour les autres :
non cette fonction n'existe pas.

Par contre elle peut etre facilement mise en oeuvre, il faut
extraire les chaines (extraitchaine) avec comme séparateur le ;
(séparateur SQL) depuis un fichier texte (tu le mets dans une méga
chaine de caractère). Pour toutes ces chaines il faut lancer
mySQLExec().

Je pense avoir donné assez de billes ;-)





Merci Manu et Eric,
j'ai déjà fait une procédure avec recherche du point-virgule, qui déclenche
l'exécution de la requète. je demandais si ça existait déjà sous une forme
plus officielle.
En fait, j'avais pensé stocker mes requètes complexes (vu mon niveau :),
complexe ne veut pas dire grand chose), sous forme, soit de fichier.sql,
soit dans un blob d'une table où je référencerais mes requètes.
les variables seraient stockées sous la forme %DATE%, etc., et gérées par la
commande Remplace.
Utopiste, peut-être ? Mais tant qu'on n'a pas de procédures stockées, faut
faire avec ce que l'on a. :)
--
Jacques TREPP
AlbyGest

enlever _pasdespam pour me joindre
Avatar
Manu
Roumegou wrote:
Manu avait énoncé :
existe-t-il avec l'acces alter natif, une commande pour exécuter un
fichier .SQL , dans le genre de la commande HExécuteRequèteSql ?



Je parle pour oracle mais il doit en etre de même pour les autres :
non cette fonction n'existe pas.

Par contre elle peut etre facilement mise en oeuvre, il faut
extraire les chaines (extraitchaine) avec comme séparateur le ;
(séparateur SQL) depuis un fichier texte (tu le mets dans une méga
chaine de caractère). Pour toutes ces chaines il faut lancer
mySQLExec().

Je pense avoir donné assez de billes ;-)

Si c'est urgent, peux-tu faire un draft de la méthode et on
l'intègre dans les accès natifs, sinon je commence à y travailler ce
soir.



Dans mes fonctions SQl, j'ai la procédure ExecBatchScript. Si cela
peut vous aider.



[CUT]

commande=TronqueDernierCaractere(lignelue) //enlève le ;



Cel ne t'oblige pas a avoir une requete sur une seule ligne ?

J'ai des requetes qui font 2000 lignes si tu veux ;-)
Avatar
Manu
> Merci Manu et Eric,
j'ai déjà fait une procédure avec recherche du point-virgule, qui
déclenche l'exécution de la requète. je demandais si ça existait déjà
sous une forme plus officielle.



Non mais rien ne t'empeche de la rendre officielle (un simple mail ou une
publication ici et çà peut êter intégré dans les futures versions)

En fait, j'avais pensé stocker mes requètes complexes (vu mon niveau
:), complexe ne veut pas dire grand chose), sous forme, soit de
fichier.sql, soit dans un blob d'une table où je référencerais mes
requètes.



On reste dans le cadre

les variables seraient stockées sous la forme %DATE%, etc., et gérées
par la commande Remplace.



La on en sort ... car c'est du spécifique. A moins de créer une classe qui
ne le fasse avec un tableau des variables %DATE%, valeur a remplacer et que
cette classe utilise les classes des accès natifs. On ne peut pas mettre la
méthode au nievau des accès natif car tu retouche les requetes avant
execution.

Utopiste, peut-être ? Mais tant qu'on n'a pas de procédures stockées,
faut faire avec ce que l'on a. :)



C'est déjà un bon moyen...
Avatar
jacques trepp
Manu wrote:
Merci Manu et Eric,
j'ai déjà fait une procédure avec recherche du point-virgule, qui
déclenche l'exécution de la requète. je demandais si ça existait déjà
sous une forme plus officielle.



Non mais rien ne t'empeche de la rendre officielle (un simple mail ou
une publication ici et çà peut êter intégré dans les futures versions)

En fait, j'avais pensé stocker mes requètes complexes (vu mon niveau
:), complexe ne veut pas dire grand chose), sous forme, soit de
fichier.sql, soit dans un blob d'une table où je référencerais mes
requètes.



On reste dans le cadre

les variables seraient stockées sous la forme %DATE%, etc., et gérées
par la commande Remplace.



La on en sort ... car c'est du spécifique. A moins de créer une
classe qui ne le fasse avec un tableau des variables %DATE%, valeur a
remplacer et que cette classe utilise les classes des accès natifs.
On ne peut pas mettre la méthode au nievau des accès natif car tu
retouche les requetes avant execution.

Utopiste, peut-être ? Mais tant qu'on n'a pas de procédures stockées,
faut faire avec ce que l'on a. :)



C'est déjà un bon moyen...



Voila ce que j'utilise actuellement.

PROCEDURE Execute_Script(Fic_Sql)
id_fic est un entier
Req_Ok est un booléen
Transaction_Démarrée est un booléen = Faux
Fic_Sql = ComplèteRep(fRepEnCours()) + "Requetes" + Fic_Sql
id_fic = fOuvre(Fic_Sql,foLecture)
SI id_fic = -1 ALORS
Erreur("Impossible d'ouvrir " + Fic_Sql)
RETOUR
FIN
MaChaineLue est une chaîne
g_cReq = "" // globale contient le texte de la requète
g_eNumReq = 1 // globale indique le N° de requète
g_bReqOk = Vrai // globale booleen de test de la transaction
MaChaineLue = SansEspace(fLitLigne(id_fic))
TANTQUE MaChaineLue <> EOT
SI MaChaineLue <> "" ALORS
SI Droite(MaChaineLue,1) = ";" ALORS
Req_Ok = Vrai
g_cReq += " "+Gauche(MaChaineLue, Taille(MaChaineLue) -1)
SINON
Req_Ok = Faux
g_cReq += " "+MaChaineLue
FIN
FIN
SI Req_Ok ET SansEspace(g_cReq) <> "" ALORS
SI PAS Transaction_Démarrée ALORS
MySql4:SetAutoCommit(Faux,g_eNumReq)
MySql4:mySQLTransaction(MySql4:mySQLDebut,g_eNumReq)
Transaction_Démarrée = Vrai
FIN
SI PAS MySql4:mySQLExec(g_cReq,g_eNumReq) ALORS
g_bReqOk = Faux
FIN
g_cReq = ""
FIN
MaChaineLue = SansEspace(fLitLigne(id_fic))
FIN
SI Transaction_Démarrée ALORS
SI PAS g_bReqOk ALORS
MySql4:mySQLTransaction(MySql4:mySQLAnnule,g_eNumReq)
Erreur("La transaction a échoué.")
SINON
MySql4:mySQLTransaction(MySql4:mySQLFin,g_eNumReq)
Info("Mise à jour terminée.")
FIN
MySql4:SetAutoCommit(Vrai,g_eNumReq)
FIN

Bien sur, c'est perfectible. Le nom envoyé est celui de la requète (ex.
stock.sql). La requète peut être sur plusieurs lignes, ou une seule. Je ne
démarre la transaction que si j'ai au moins une requète non vide.
Mon problème vient des éléments variables d'une requète.
Pour alléger mon code, et améliorer la lisibilité, j'aurais préféré utiliser
des variables dans mes scripts, mais, tu as raison, ça sort du cadre évoqué.
C'est d'autant plus intéressant, qu'on peut modifier ou améliorer un script
sans recompilation ni mise à jour de l'appli.

merci encore

--
Jacques TREPP
AlbyGest

enlever _pasdespam pour me joindre
Avatar
Manu
>


[CUT]
Bien sur, c'est perfectible. Le nom envoyé est celui de la requète
(ex. stock.sql). La requète peut être sur plusieurs lignes, ou une
seule. Je ne démarre la transaction que si j'ai au moins une requète
non vide.



Nickel,

Mon problème vient des éléments variables d'une requète.
Pour alléger mon code, et améliorer la lisibilité, j'aurais préféré
utiliser des variables dans mes scripts, mais, tu as raison, ça sort
du cadre évoqué. C'est d'autant plus intéressant, qu'on peut modifier
ou améliorer un script sans recompilation ni mise à jour de l'appli.



Je vois très bien l'interet. Il te suffit simplement de créer une classe
avec 2 membres : un pour la connexion avec l'accès natifs, un autre qui est
un tableau de tes valeurs (1 colonne %variable%, une colonne valeur à
affecter). 2 méthodes : AffecteValeurs qui affecte les valeurs / à tes
variables et une autre ExecuteRequete

merci encore