创建的语句是:
 create or replace trigger update_product_count
 after insert or update on product_main for each row
 declare
 left number(38);
 put number(38);
 get number(38);
 begin
 select put_count into put from product_main where id = :new.id;
 select get_count into get from product_main where id = :new.id;
 left := put-get;
 update product_main set leave_count = left where id = :new.id;
 end;创建的时候没有报错。。
我这个触发器就是要跟新同一个表中的数据,每当跟新的 时候,left(剩余的) = put(放入)-get(拿取得的)。
就是要更新剩余的。
下面是是表的结构:
 Name                                      Null?    Type
 ----------------------------------------- -------- --------------- ID                                        NOT NULL NUMBER
 NAME                                      NOT NULL VARCHAR2(30)
 NOTE                                               VARCHAR2(200)
 LEAVE_COUNT                                        NUMBER
 GET_COUNT                                          NUMBER
 PUT_COUNT                                          NUMBER
 GET_DATE                                           DATE
 PUT_DATE                                           DATE
当我往表中插入数据的时候就出现错误。但是我show error,却没有错误。
SQL> insert into product_main values(1,'安踏','中国名牌',10,0,10,sysdate,sysdate);出入的时候的错误提示是:insert into product_main values(1,'安踏','中国名牌',10,0,10,sysdate,sysdate)
            *
ERROR at line 1:
ORA-04091: table SCOTT.PRODUCT_MAIN is mutating, trigger/function may not see it
ORA-06512: at "SCOTT.UPDATE_PRODUCT_COUNT", line 6
ORA-04088: error during execution of trigger 'SCOTT.UPDATE_PRODUCT_COUNT'
请大家帮我看看什么地方有错。。谢谢

解决方案 »

  1.   

     create or replace trigger update_product_count
     after insert or update on product_main for each row
     declare
     PRAGMA AUTONOMOUS_TRANSACTION;
     left number(38);
     put number(38);
     get number(38);
     begin
     select put_count into put from product_main where id = :new.id;
     select get_count into get from product_main where id = :new.id;
     left := put-get;
     update product_main set leave_count = left where id = :new.id;
     commit;
     end;
      

  2.   


    create or replace trigger update_product_count
    before insert or update on product_main for each row
     begin
     select put_count-get_count  into :new.leave_count  from product_main where id = :new.id;
     end;
      

  3.   

    对Update操作再Update操作,是不是类似于死循环了?
      

  4.   

    不要太过度依赖触发器去保证业务逻辑,这种情况建议不要使用触发器
    一般采取计算字段就可以了
    suiziguo的方法也是不行的,对于插入,会报未找到数据的异常!
      

  5.   

    数据库设计原则就是除非万不得已,坚决不使用触发器。如果楼主坚持使用,则应采用自治事务。
    对于insert情况,可以用
    IF inserting THEN
       put_count := 0;
       get_count := 0;
    END IF;
    或者类似的。其实楼主该需求本来就有些奇怪,insert时没必要更新自己。