TRIGGERS... question tres simple pour ceux qui connaissent.. [oracle] - Programmation
Marsh Posté le 30-07-2002 à 14:47:33
bon je vais ne mettre qu'un champ dans la after update of
et mettre une condition sur le 2ème champ dans l'action...
autre question...
j'utilise :new et ld...
existe-t-il un :current ou equivalent ?
ou bien le nom du champ seul suffit pour déterminer l'enregistrement courrant ?
Marsh Posté le 30-07-2002 à 14:48:08
ouf a écrit a écrit : bon je vais ne mettre qu'un champ dans la after update of et mettre une condition sur le 2ème champ dans l'action... autre question... j'utilise :new et ld... existe-t-il un :current ou equivalent ? ou bien le nom du champ seul suffit pour déterminer l'enregistrement courrant ? |
derniere option
Marsh Posté le 30-07-2002 à 14:54:08
merci bien
j'avais jamais fait de trg à la paluche...
et ça fait longtemps que j'ai pas touché developper2000....
merci bien, je m'en sors
Marsh Posté le 30-07-2002 à 16:25:47
nouvelle question, toujours à propos de l'enregistrement courant...
mon trigger ressemble à ça :
create or replace TRIGGER RTL_delete
AFTER UPDATE OF CUR_VAL ON MYTABLE
FOR EACH ROW
DECLARE VL_ID2 number;
BEGIN
if :new.CUR_VAL = 0 and :new.INS_UPDT = 3 then
update TABLE1 set cur_val = :new.CUR_VAL, ins_updt = :new.INS_UPDT, val_dt = sysdate
where TABLE1.ID = ID;
update TABLE2 set cur_val = :new.CUR_VAL, ins_updt = :new.INS_UPDT, val_dt = sysdate
where TABLE2.ID = ID;
update TABLE3 set cur_val = :new.CUR_VAL, ins_updt = :new.INS_UPDT
where TABLE3.ID = ID;
select TABLE3.ID2 into VL_ID2 from TABLE3
where TABLE3.ID = ID;
update TABLE4 set cur_val = :new.CUR_VAL, ins_updt = :new.INS_UPDT, val_dt = sysdate
where TABLE4.ID = ID;
update TABLE5 set cur_val = :new.CUR_VAL, ins_updt = :new.INS_UPDT, val_dt = sysdate
where TABLE5.ID2 = VL_ID2;
end if;
END;
/
est-ce que dans tous les cas le ID qui est en gras correspond à celui de l'enregistrement modifié dans MYTABLE ??
car dans le cas du select, ça ne me ramène pas qu'une seule valeur alors que ça devrai... du coup, ORA-01422...
... et dans d'autres triggers similaires (mais sans select, avec donc moins de jointures entre les tables), l'ID correspond bien à l'enregistrement modifié dans la table de départ car les bons enregistrements sont modifiés dans les tables suivantes...
je précise que ma TABLE3 ne contient qu'un seul enregistrement pour l'ID...
merci de votre aide !
Marsh Posté le 30-07-2002 à 16:51:26
j'vois pas trop ou pourrait etre le pb ...
ID c ton identifiant ? il est bien unique ?
Marsh Posté le 30-07-2002 à 16:58:23
HappyHarry a écrit a écrit : j'vois pas trop ou pourrait etre le pb ... |
je l'ai trouvé !!
merci HappyHarry
oui ID est bien l'identifiant unique
en fait, il me suffit d'imbriquer le select dans le dernier update sans passer par une variable
il semblerai que les select dans des trigger c pas trop ça... de plus, j'ai un peu abusé avec la Chartreuse hier soir, là je rame pas mal...
merci encore, @++
Marsh Posté le 30-07-2002 à 17:00:01
ouf a écrit a écrit : je l'ai trouvé !! merci HappyHarry oui ID est bien l'identifiant unique en fait, il me suffit d'imbriquer le select dans le dernier update sans passer par une variable il semblerai que les select dans des trigger c pas trop ça... de plus, j'ai un peu abusé avec la Chartreuse hier soir, là je rame pas mal... merci encore, @++ |
euh ... j'pas tout compris, tu peux poster le code final, ca pourra toujours servir a qq'un
Marsh Posté le 30-07-2002 à 17:28:15
yaiss
en fait j'ai fait ça (attention c vraiment tout con )
create or replace TRIGGER RTL_delete
AFTER UPDATE OF CUR_VAL ON MYTABLE
FOR EACH ROW
BEGIN
if :new.CUR_VAL = 0 and :new.INS_UPDT = 3 then
update TABLE1 set cur_val = :new.CUR_VAL, ins_updt = :new.INS_UPDT, val_dt = sysdate
where TABLE1.ID = ID;
update TABLE2 set cur_val = :new.CUR_VAL, ins_updt = :new.INS_UPDT, val_dt = sysdate
where TABLE2.ID = ID;
update TABLE3 set cur_val = :new.CUR_VAL, ins_updt = :new.INS_UPDT
where TABLE3.ID = ID;
update TABLE4 set cur_val = :new.CUR_VAL, ins_updt = :new.INS_UPDT, val_dt = sysdate
where TABLE4.ID = ID;
update TABLE5 set cur_val = :new.CUR_VAL, ins_updt = :new.INS_UPDT, val_dt = sysdate
where TABLE5.ID2 in (select TABLE3.ID2 from TABLE3
where TABLE3.ID = ID);
end if;
END;
/
c t vraiment tout bête...
Marsh Posté le 30-07-2002 à 14:43:00
salut à tous
voilà, je dois écrire des triggers....
il doivent se déclencher suite à l'update de DEUX champs dans une table....
comment capturer l'évenement ??
create or replace TRIGGER PP_delete
AFTER UPDATE OF CUR_VAL and INS_UPDT ON MYTABLE
y a-t-il quelque chose qui ressemble à ça ??
merci !
Message édité par ouf le 30-07-2002 à 16:28:52