考虑一下;update表的触发器在update记录后触发,而贴主要‘重新计算’是不是指再update表呢?这样岂不是循环递归?肯定不行。

解决方案 »

  1.   

    不是的,我不是再UPDATE表,只要计算出一个数字来就行。就是这样的:
    select sum(part_price) into price from part;
    触发后出错。意思就是在part表的触发器中不能读part表中的记录。
      

  2.   

    如果触发器不是for each row的就可以
      

  3.   

    唉,那不行啊,因为实际情况不像我上面那个语句那么简单,我必须要用到:new,只能是for each row
      

  4.   

    select sum(part_price) into :new.price from part;   好象可以了。我原来也使用过,好象是这样。
      

  5.   

    你用dbms_pipe包发消息,例如:
    declare
      v_status number;
    v_status := dbms_pipe.send_message('RECOMPUTE');
    然后,在你的客户程序中取得消息,并计算,也可用pro*c, oci等作轮巡
    declare
      v_status number;
    v_status := dbms_pipe.receive_message('RECOMPUTE');
    得到消息进行计算
      

  6.   

    建多个触发器能解决此问题:
    CREATE OR REPLACE TRIGGER Tri_part3
     BEFORE INSERT OR UPDATE ON PART
     for each row
    begin
      ---使用:new, :old
    end;CREATE OR REPLACE TRIGGER Tri_part3
     AFTER INSERT OR UPDATE ON PART
    DECLARE
      tmpVar NUMBER;
    BEGIN
       tmpVar := 0;   Select sum(price) into tmpVar from part;
       if (tmpVar) > 200 then
        raise_application_error(-20000, 'price is too large');
       end if;
    END Tri_part3;
      

  7.   

    建立两个触发器、同时建立一个包头。
    1、包头用来存放行级触发器中曾经更新过的行的主键
    2、行级的触发器用来设置每次触发行的主键、用:new或:old
    3、语句级触发器用来设置每次更新后的值。
    例子由于我正在上网无法连上数据库拷贝代码、大概思想就是这样
    你可以找找关于触发器变化表的资料。
      

  8.   

    look来各有建义继续关注。师傅这句不行吗?select sum(part_price) into :new.price from part;   
      

  9.   

    唉,各位的办法都解决不了问题啊,因为我的SUM求和是和:new,:old相关的,也就是说SUM求和中带有条件,必须用到:new。
    所以触发器必须是FOR EACH ROW的。
      

  10.   

    建两个触发器可以解决,
    一个行级before触发器,
    把新价格放在包变量里面
    再建一个语句级after触发器
    实现计算总价
      

  11.   

    我想你可以这样做,根本不用调用循环
    求和,
    再加上新旧数据的差额select sum(colname) into oldsum from yourtable
    if oldsum + new.colname - old.colname > maxvalue then
        return false;
    end if