|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Nouveau Membre du Club
![]() Inscription : juillet 2005 Messages : 42 ![]() |
Bonjour,
J'ai des soucis avec un problème de table mutante, naturellement j'ai fait des recherches sur google et j'ai lu attentivement le tutoriel http://sgbd.developpez.com/oracle/ora-04091/ J'ai simplifié mon problème en ce que je vous expose ci-après pour faciliter la compréhension, mais il s'agît également de ce que je suis en train de tester. Mes Tables : etudiant (id, nom, moyenne); matiere (id, note, id_etudiant); Je souhaiterai calculer la moyenne d'un étudiant à chaque fois qu'une note est modifiée (imaginons que toutes les notes dont j'ai besoin sont déjà insérées et initialisées). Pour cela on m'impose l'utilisation d'un Trigger. Mon Trigger sera appelé lors de l'utilisation d'un UPDATE de cette forme : Code :
Voici le Trigger : Code :
1ere remarque : Dans le tuto Développez.com, la méthode "E-4. Je suis grand, c'est moi qui gère" me fait sortir du Trigger sans modifier la moyenne. 2eme remarque : Je préfère ne pas avoir recours aux autres méthodes de ce tutoriel (pour le moment...) pour diverses contraintes auxquelles je suis soumis. J'ai eu accès à un code semblable au mien qui marche en utilisant une directive PRAGMA AUTONOMOUS_TRANSACTION, de plus après des recherches cette solution semble effectivement marcher, et elle m'intéresse très fortement. J'ai donc modifié mon Trigger comme suit : Code :
J'ai essayé de déplacer le COMMIT dans le trigger, et de le mettre partout dans le trigger ( J'aimerais donc savoir si il y avait une explication à ce phénomène et si je pouvais y remédier (en gardant la solution des transactions autonomes qui semble marcher dans le même cas de figure sur d'autres applications...). Maintenant si vous me déconseillez cette méthode (même si jamais j'arrivai à la faire marcher), j'aimerai également savoir pourquoi (sachant qu'il s'agît d'une application multi-thread) Merci d'avance pour vos conseils |
||||||
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 319 ![]() |
Chaque fois quand j'arrive à faire PRAGMA_AUTONOMOUS_TRANSACTION et COMMIT dans un trigger je me dit que je suis bien dans les choux et donc je change de solution.
|
|
|
00
|
|
|
#3 |
|
Expert Confirmé
![]() Chef de projet en SSII Inscription : janvier 2004 Messages : 2 866 ![]() |
Une des solutions envisageables est de mémoriser les matières mises à jour (tableau, table temporaire, ...) dans un trigger for each row
Puis dans un trigger after update global, de calculer les moyennes pour ces matières et de mettre à jour la table etudiant. Si tu peux passer par une table temporaire, il me semble que c'est la meilleure solution car elle sera automatiquement remise à vide au commit. Le tableau devra être lui remis à zéro.
__________________
Un problème sans solution est un problème mal posé Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP. |
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
une vue matérialisée en ajoutant la colonne moyenne qui se rafraichie ON_COMMIT me parait beaucoup mieux indiquer qu'un trigger.
Eventuellement, tu peux peut-être créer une fonction en AUTONOMOUS TRANSACTION qui retourne la moyenne d'un éléve que tu appelleras dans ton trigger. |
|
|
00
|
|
|
#5 |
|
Expert Confirmé
![]() Chef de projet en SSII Inscription : janvier 2004 Messages : 2 866 ![]() |
Non cela ne marchera pas puisque avec ta fonction en autonomous_transaction tu verras la valeur de la note avant la mise à jour.
__________________
Un problème sans solution est un problème mal posé Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP. |
|
|
00
|
|
|
#6 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
tu peux passer old et new en paramètre pour remplacer la valeur dans la fonction éventuellement
|
|
|
00
|
|
|
#7 |
|
Nouveau Membre du Club
![]() Inscription : juillet 2005 Messages : 42 ![]() |
Merci pour tous vos conseils! Je vais essayer tout ça
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com