|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre du Club
![]() Inscription : mars 2008 Messages : 227 ![]() |
Bonjour.
Je précise que je suis débutant avec les triggers. Voilà le problème: J'ai une table RELTUBES qui contient un champ identifiant TUBE_ID créé avec une séquence. Cette table contient aussi un champ TUBE_GVID et un champ TUBE_TRANCHEID. Lorsque j'ajoute ou modifie une ligne dans RELTUBES (en particulier le champ TUBE_GVID), je veux mettre la valeur 1 (je simplifie pour l'instant) dans le champ TUBE_TRANCHEID lorsque TUBE_GVID n'est pas NULL. J'ai donc tapé ceci: Code :
ORA-04091: la table UTILISATEURRELACHEMENT.RELTUBES est en mutation ; le déclencheur ou la fonction ne peut la voir Comment faire? Merci. |
||
|
|
00
|
|
|
#2 |
![]() ![]() |
L'erreur provient d'un simple problème de logique.
Votre trigger se déclenche APRÈS insertion ou mise à jour. Mais pendant votre trigger, vous lancez une mise à jour, qui va donc exécuter le trigger, qui va donc refaire une mise à jour... Il faut donc que votre trigger s'exécute avant insertion ou mise à jour, et il suffit de modifier la nouvelle valeur de TUBE_TRANCHEID (une simple assignation, pas d'update nécessaire). Je vous laisse chercher un peu pour la syntaxe.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#3 | |
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
La "Mutating Table error" est là pour vous protéger. Elle est là pour vous dire que votre logique n'est pas bonne. Pour votre gouverne, lorsque vous crééz un trigger sur une table T et que le contenu de ce trigger fait un select/update sur la table T, sachez alors que votre logique n'est pas bonne. De plus, si tant est que votre trigger n'est pas en erreur, avez-vous pensé, lors de la création de ce trigger, à l'impact qu'aura ce trigger sur une application mutli-users mutli-concurrente. Moralité : faire très attention à l'aspect mutli-user lors de l'utilisation des triggers Bien à vous Mohamed Houri |
|
|
|
00
|
|
|
#4 | ||
|
Membre du Club
![]() Inscription : mars 2008 Messages : 227 ![]() |
J'ai esayé ce code:
Code :
OCI_NO_DATA Il n'est toujours pas bon mon trigger? |
||
|
|
00
|
|
|
#5 |
![]() ![]() |
Vous n'être plus très loin, il y a encore plus simple pour assigner une valeur, sans SELECT cette fois-ci.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#6 |
|
Membre du Club
![]() Inscription : mars 2008 Messages : 227 ![]() |
OK. Je n'ai pas trouvé...
Ce serait vraiment sympa de me donner la solution |
|
|
00
|
|
|
#7 |
![]() ![]() |
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#8 |
|
Membre du Club
![]() Inscription : mars 2008 Messages : 227 ![]() |
évidemment.
|
|
|
00
|
|
|
#9 | ||||
|
Membre du Club
![]() Inscription : mars 2008 Messages : 227 ![]() |
Maintenant un peu plus compliqué:
au lieu de mettre 1 dans :new.TUBE_TRANCHEID, je veux mettre Code :
SELECT GV_INTERVALLEENTRERGVID FROM RELGV WHERE GV_ID=:new.TUBE_GVID Cette requête ne renvoie qu'une valeur. J'ai donc essayé : Code :
puis : Code :
Que faut-il faire? |
||||
|
|
00
|
|
|
#10 | ||
![]() ![]() |
Vous aimez bien faire compliqué, vous aviez déjà écrit la bonne syntaxe un peu plus haut :
Code :
Toutes les colonnes existent, que ce soit les anciennes ou nouvelles valeurs avec les préfixes new et old.
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#11 |
|
Invité de passage
![]() Benj Inscription : août 2011 Messages : 1 ![]() |
Bonjour
J'ai un trigger insert que je voudrais bien modifié pour en faire un update avez-vous une solution SVP ? J'avoue que je suis perdu avec çà, j'ai même essayer de faire une table à coté. mais resultat néant. grr j'en perds mon latin c'est clair. Merci d'avance pour votre aide. ========================= create or replace TRIGGER CAD_NUM_RUE after INSERT ON CAD_NUM_RUE BEGIN update CAD_NUM_RUE set CAD_NUM_RUE.adresse = CAD_NUM_RUE.num ||' '|| CAD_NUM_RUE.RUE; END; ========================= |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com