SELECT SUM(:old.SUB_END*:old.INT_DEB_CRE) INTO oldEND FROM ACC_SUB_COD WHERE INT_REP=(SELECT NUM FROM ACC_REP_COD) GROUP BY INT_REP;//此语句出错:这句是不是就是下面的意思?
oldEND := :old.SUB_END*:old.INT_DEB_CRE;

解决方案 »

  1.   

    不是的,要用到SUM这个函数,
      

  2.   

    这样吧! 我给你们看看在SQL SERVER 7。0中这个触发器的写法,我运行过完全正确!
    CREATE TRIGGER dbo.acc_sub_cod_upd ON dbo.acc_sub_cod
    FOR UPDATE
    AS
    IF      update(sub_end)
    BEGIN
    UPDATE  acc_rep_cod
    SET     rep_end=rep_end-(SELECT SUM(sub_end*deb_cre) FROM deleted WHERE rep_num=acc_rep_cod.num GROUP BY rep_num)
    +(SELECT SUM(sub_end*deb_cre) FROM inserted WHERE rep_num=acc_rep_cod.num GROUP BY rep_num)
    WHERE   num=(SELECT rep_num FROM inserted)
    END
    IF      update(sub_beg)
    BEGIN
    UPDATE  acc_rep_cod
    SET     rep_beg=rep_beg-(SELECT SUM(sub_beg*deb_cre) FROM deleted WHERE rep_num=acc_rep_cod.num GROUP BY rep_num)
    +(SELECT SUM(sub_beg*deb_cre) FROM inserted WHERE rep_num=acc_rep_cod.num GROUP BY rep_num)
    WHERE   num=(SELECT rep_num FROM inserted)
    UPDATE  acc_sub_cod
    SET     sub_end=sub_end-(SELECT sub_beg FROM deleted)
    +(SELECT sub_beg FROM inserted)
    WHERE   num=(SELECT num FROM inserted)
    END
      

  3.   

    看了你的SQL SERVER的触发器我有点明白你的目的了。Oracle的触发器有两种一种是行级,一种是语句级,你的SQL SERVER触发器相当于语句级触发器,但是你要得到该语句所更新的值的总和,只要在行级触发器中处理,不需要sum也可以,多次触发行触发器等于语句级的累加。下面的触发器应该能够满足你的要求,不过希望num是acc_sub_cod的主键。CREATE OR REPLACE TRIGGER acc_sub_cod_upd 
    AFTER UPDATE ON acc_sub_cod
    FOR EACH ROW
    BEGIN
      IF :old.sub_end <>  :new.sub_end then
        UPDATE  acc_rep_cod
        SET     rep_end=rep_end-decode(num,:old.rep_num,:old.sub_end*:old.deb_cre,0)
                        + :new.sub_end*:new.deb_cre
        WHERE   num=:new.rep_num;
      END IF;
      IF :old.sub_beg <>  :new.sub_beg then
        UPDATE  acc_rep_cod
        SET     rep_end=rep_end-decode(num,:old.rep_num,:old.sub_beg*:old.deb_cre,0)
                        + :new.sub_beg*:new.deb_cre
        WHERE   num=:new.rep_num;
        
        :new.sub_end=:old.sub_end-:old.sub_beg+:new.sub_beg;
      END IF;
    end;
    /
      

  4.   

    是这样的呀~! 可是我这里有子查询条件,应该怎么写呢?
    UPDATE  acc_rep_cod
    SET     rep_end=rep_end-(SELECT SUM(sub_end*deb_cre) FROM deleted WHERE rep_num=acc_rep_cod.num GROUP BY rep_num)//子查询条件rep_num=acc_rep_cod.num 
    +(SELECT SUM(sub_end*deb_cre) FROM inserted WHERE rep_num=acc_rep_cod.num GROUP BY rep_num)//子查询条件rep_num=acc_rep_cod.num 
    WHERE   num=(SELECT rep_num FROM inserted)num是acc_sub_cod的主键。
      

  5.   

    行级触发器是指每更改一条记录时都会触发,所以不需要查询,也不需要累加,每条记录的更新都执行下面的语句,也就等于累加了!rep_end=rep_end-decode(num,:old.rep_num,:old.sub_end*:old.deb_cre,0)
                        + :new.sub_end*:new.deb_cre你可以试试我写的触发器,使用一条更新很多条记录的SQL语句,应该可以达到你要的效果。
      

  6.   

    decode(num,:old.rep_num......) 为什么要用‘:old.rep_num’,而不可以用‘rep_num’?
      

  7.   

    rep_num这个字段是哪个表的?我以为是acc_sub_cod的,在acc_sub_cod表的触发器中调用字段值当然要指定:new或:old了。
      

  8.   

    是我搞错了,Lastdrop你说的很对,大概是我不懂decode函数的用法,我后来看看了书,rep_num是acc_sub_cod表的,你的触发器我试了,很正确,但是我有一点搞不懂,
    rep_end=rep_end-decode(num,:old.rep_num,:old.sub_end*:old.deb_cre,0)
                        + :new.sub_end*:new.deb_cre
    能不能写成 rep_end=rep_end-decode(num,:old.rep_num,:old.sub_end*:old.deb_cre,0)
                        +decode(num,:old.rep_num,:new.sub_end*:new.deb_cre,0)这个也要条件查询的呀,是不是有了上面的“DECODE”下面就不要用了。beckhambobo(beckham):整个触发器代码我写了呀,不过是SQL SERVER 7。0的,不知写成ORACLE 怎么写!
      

  9.   

    decode(num,:old.rep_num,:new.sub_end*:new.deb_cre,0)如果需要decode,也应该是decode(num,:new.rep_num,:new.sub_end*:new.deb_cre,0)
    而你的查询条件已经有WHERE num=:new.rep_num;,所以num是肯定等于:new.rep_num的,也就不需要decode了。