有两表a,b
   
    a表                          b表
name    money  state         name    money2
小李     5.0      1          小李     36.3
小王     3.0      2          小王     55.6现欲实现一触发器,在每次用insert语句插入a 表时,判断如果状态为1,则此人在b表的money2+money,如果为2,则b表此人的money2-money。
小弟还不会写触发器,请大家帮帮忙。

解决方案 »

  1.   

    CREATE OR REPLACE TRIGGER TREATE_DATA
    AFTER INSERT ON A FOR EACH ROW
    BEGIN
    UPDATE B SET MONEY2=MONEY2+SIGN(:NEW.STATE-1.5)*:NEW.MONEY WHERE NAME=:NEW.NAME;
    END;
      

  2.   

    不好意思,符号搞反了。CREATE OR REPLACE TRIGGER TREATE_DATA
    AFTER INSERT ON A FOR EACH ROW
    BEGIN
    UPDATE B SET MONEY2=MONEY2-SIGN(:NEW.STATE-1.5)*:NEW.MONEY WHERE NAME=:NEW.NAME;
    END;
      

  3.   

    请问 njhart2003  SIGN(:NEW.STATE-1.5)*:NEW.MONEY 是干嘛的,我用状态1和2来判断是加操作还是减操作,  如果状态换为其他数呢?
      

  4.   

    我知道SIGN()是干嘛用的了,现在我还有个问题,
       
        a表                          b表
    name    money  state         name      money1  money2
    小李     5.0      1          小李       32     36.3
    小王     3.0      2          小王       11     36.3如果为1的话加到money1,2时加到money,是否要用到if判断?
      

  5.   

    当然可以用if判断
    ....
    IF :NEW.STATE=1 THEN
        UPDATE B SET MONEY1=MONEY1+:NEW.MONEY WHERE NAME=:NEW.NAME;
    ELSIF :NEW.STATE=2 THEN
        UPDATE B SET MONEY2=MONEY2+:NEW.MONEY WHERE NAME=:NEW.NAME;
    END IF; 
    .....当然也可以用一条语句:
    ...
    UPDATE B 
    SET MONEY1=MONEY1+DECODE(:NEW.STATE,1,:NEW.MONEY,0),
        MONEY2=MONEY2+DECODE(:NEW.STATE,2,:NEW.MONEY,0) 
    WHERE NAME=NEW.NAME;
    ...
      

  6.   

    CREATE OR REPLACE TRIGGER TREATE_DATA
                      AFTER INSERT ON A
                       FOR EACH ROW                BEGIN                   IF  :new.state = 0  THEN                      UPDATE B SET MONEY2=MONEY2-SIGN(:NEW.STATE-1.5)*:NEW.MONEY WHERE NAME=:NEW.NAME;
                       IF  :new.state = 1  THEN                      UPDATE B SET MONEY2=MONEY2+SIGN(:NEW.STATE-1.5)*:NEW.MONEY WHERE NAME=:NEW.NAME;
                       END IF ;
                    END ;
      

  7.   

    写错了,应该是:
    CREATE OR REPLACE TRIGGER TREATE_DATA AFTER INSERT ON A FOR EACH ROW
    BEGIN
       IF  :new.state = 0  THEN
          UPDATE B SET MONEY2=MONEY2-SIGN(:NEW.STATE-1.5)*:NEW.MONEY WHERE NAME=:NEW.NAME;
       END IF
       IF  :new.state = 1  THEN
          UPDATE B SET MONEY2=MONEY2+SIGN(:NEW.STATE-1.5)*:NEW.MONEY WHERE NAME=:NEW.NAME;
       END IF
    END ;
      

  8.   

    我用了....
    IF :NEW.STATE=1 THEN
        UPDATE B SET MONEY1=MONEY1+:NEW.MONEY WHERE NAME=:NEW.NAME;
    ELSIF :NEW.STATE=2 THEN
        UPDATE B SET MONEY2=MONEY2+:NEW.MONEY WHERE NAME=:NEW.NAME;
    END IF; 
    .....  
    可是oracle总是报MONEY1和MONEY2 出错。但是用decode就没问题 ,不知怎么回事?
      

  9.   

    如果你在触发器里需提交(commit;)
    那么需要在定义部分加入"pragma autonomous_transaction;" --自治事务......
      

  10.   

    decode函数就相当于if... else ...
      

  11.   

    我报的错为“表或试图不存在”或“MONEY1,MONEY2字段不存在”之类的错。但decode就可以,不管怎么样,有一个可以就ok。
      谢谢两位,结帖!
      

  12.   

    yx580tnt(yan):你的a表和b表中只有money和money2字段,哪有money1字段啊,你用的语句中却有money1,当然出错了!你改为:
    IF :NEW.STATE=1 THEN
        UPDATE B SET MONEY2=MONEY2+:NEW.MONEY WHERE NAME=:NEW.NAME;
    ELSIF :NEW.STATE=2 THEN
        UPDATE B SET MONEY2=MONEY2-:NEW.MONEY WHERE NAME=:NEW.NAME;
    END IF; 
    就可以了。