|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Nouveau Membre du Club
![]() Inscription : juillet 2005 Messages : 89 ![]() |
Bonjour,
1/ Bonnes pratiques : Pour plus de visibilité dans le code d'un TRIGGER, je déclare un bon nombre de variables venant de la table mise à jour Ex. : Code :
2/ J'ai lu que la SQL dynamique ou l'appel d'une procédure dans un trigger n'est pas possible -A- ai je bien compris ? -B- Un moyen de contourner cela ? Je m'explique : pour le calcul d'un prix d'un article, je fais appel à n paramètres qui selon leur valeur implique un traitement spécifique. Je me vois mal faire un Code :
Merci
__________________
Samish, rentier et futur retraité Padawan #7896358 |
||||
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
1/ je ne vois absolument pas l'intérêt... sans même parler de performance, je trouve que tu perds énormément de lisibilité au lieu d'en gagner.
2/ Si mes souvenirs sont exacts, tu as le droit d'appeler une procédure dans un trigger, du moment que la procédure ne fait rien qui soit interdit au trigger... Plus généralement, même si tu appelais une procédure, je ne vois pas ce que tu pourrais en faire, car les procédures MySQL ne sont pas censées renvoyer de résultat. Dans ton cas, une fonction me semblerait plus adaptée. |
|
|
00
|
|
|
#3 | ||
|
Nouveau Membre du Club
![]() Inscription : juillet 2005 Messages : 89 ![]() |
Bonjour Antoun
Merci de vos réponses 1/ Exact à l'usage c'est vraiment pas utile. 2/ "Dans ton cas, une fonction me semblerait plus adaptée." Vous voulez dire : A- appeler la func dans le trigger B- remplacer le trigger par une func ? Mon pb au sein de ce trigger étant de crée dynamiquement une phrase sql excutée au sein de ce trigger Code :
__________________
Samish, rentier et futur retraité Padawan #7896358 |
||
|
|
00
|
|
|
#4 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Je pensais à une fonction dans un trigger, avec tous les if et autres dans la fonction (qui peut ainsi être appelée par plusieurs triggers, par exemple à la fois le ON INSERT et le ON UPDATE).
Quant à ton idée d'utiliser du SQL dynamique (PREPARE / EXECUTE), je ne suis pas sûr que ce soit possible, et ce n'est pas une good practice quand ça peut être évité... si tu nous donnes la liste des cas que tu veux traiter, on peut t'aider à réécrire tout ça en SQL statique. |
|
|
00
|
|
|
#5 | ||||||
|
Nouveau Membre du Club
![]() Inscription : juillet 2005 Messages : 89 ![]() |
Bonjour,
0/ Merci de votre aide 1/ Concernant le traitement des paramètres d'insertion des prix dans le trigger, c'est ok. J'ai fait : Code :
Code :
La phrase SQL qui joint la table td_items et la table td_items_prices. Je m'explique : Un article a un prix "normal" (public_price) Un article peut avoir un prix "promo" (OC_ID=0, Discount_price) Un article peut avoir n prix en fonction des oc (OC_ID>0, Discount_price) Si je fais : Code :
Code,Discount_oc_id,Public_price,Discount_price "ABC-1";"0";"260.000";"0" (prix public) "ABC-1";"0";"260.000";"130.000" (prix promo) "ABC-1";"117";"260.000";234.000"; (prix oc) Il me faut donc dédoublonner en récupérant les prix par priorité croissante, s'ils existent : Si Discount_oc_id=0 AND Discount_price>0 => Prix promo (priorité 1) Si Discount_oc_id>0 AND Discount_price>0 => Prix oc (priorité 2) Si Discount_oc_id=0 AND Discount_price=0 => Prix public (priorité 3) Le GROUP BY A.Item_parent_id, me dédoublonne bien les prix, mais ne me sort pas les prix par priorité. Un tips, une autre façon de faire svp ? Merci
__________________
Samish, rentier et futur retraité Padawan #7896358 |
||||||
|
|
00
|
|
|
#6 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Pour répondre déjà à ton 2/, si tes prix non-existant étaient NULL au lieu de 0, tu pourrais faire ça (je crois comprendre que l'arbitrage entre prix OC et prix promo est déjà fait) :
Code SQL :
COALESCE(Discount_Price, Public_price) Si tu dois absolument garder tes zéros, ça donne : Code SQL :
COALESCE(NULLIF(Discount_Price, 0), Public_price) |
|
|
00
|
|
|
#7 | ||||
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Pour ton 1/ maintenant, tu peux simplifier ton code en transformant les IF en WHERE dans ton INSERT :
Code :
De même, pour ta gestion des marques, le IF peut se remplacer par un WHERE sur le DELETE : Code :
|
||||
|
|
00
|
|
|
#8 | ||
|
Nouveau Membre du Club
![]() Inscription : juillet 2005 Messages : 89 ![]() |
Re,
0/ Un grand merci pour le temps consacré. 1/ Je teste cela et vous tiens au courant 2/ Même chose, je teste. Je m'en suis sorti avec un : Rem : Mes phrase sql sont des variables, dans le code, je remplace /*CLAUSE*/ et /*LIMIT*/ Code :
__________________
Samish, rentier et futur retraité Padawan #7896358 |
||
|
|
00
|
|
|
#9 |
|
Membre confirmé
![]() ![]() Inscription : novembre 2007 Messages : 134 ![]() |
Bonjour,
Juste pour préciser un point lu dans le premier post, en effet Mysql refuse d'utiliser dans un trigger une procédure stockée qui utilise du sql dynamique. C'est franchement galère, peut être que cela sera possible prochainement ou peut être déjà en version 5.5 |
|
|
00
|
|
|
#10 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
on peut considérer ça comme
?
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com