[oracle] TRIGGERS... question tres simple pour ceux qui connaissent..

TRIGGERS... question tres simple pour ceux qui connaissent.. [oracle] - Programmation

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
Reply

Marsh Posté le 30-07-2002 à 14:43:00   

Reply

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 :old...
existe-t-il un :current ou equivalent ?
ou bien le nom du champ seul suffit pour déterminer l'enregistrement courrant ?

Reply

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 :old...
existe-t-il un :current ou equivalent ?
ou bien le nom du champ seul suffit pour déterminer l'enregistrement courrant ?




 
derniere option


Message édité par HappyHarry le 30-07-2002 à 14:48:25
Reply

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 ;)

Reply

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 !


Message édité par ouf le 30-07-2002 à 16:48:20
Reply

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 ?


Message édité par HappyHarry le 30-07-2002 à 16:56:40
Reply

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 :jap:
 
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, @++


Message édité par ouf le 30-07-2002 à 16:59:36
Reply

Marsh Posté le 30-07-2002 à 17:00:01    

ouf a écrit a écrit :

 
 
je l'ai trouvé !!
 
merci HappyHarry :jap:
 
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

Reply

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...


Message édité par ouf le 30-07-2002 à 17:28:47
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed