create or replace trigger tri_work 
after insert 
on work
for each row
declare
v_count number(8);
begin
  select count(1) into v_count from resource where id = :new.id;
  if v_count > 0 then
     update  resource set count = count+1 where id = :new.id;
  else 
     insert into resource (id,count) values (:new.id,1);
  end if;
end;
/

解决方案 »

  1.   

    老大出错啦。。
    当俺手工执行一条insert into work语句的时候出现下面的错误。
    ERROR at line 1:
    ORA-04091: table SCOTT.RESOURCE is mutating, trigger/function may not see it
    ORA-06512: at "SCOTT.TRI_WORK", line 8
    ORA-04088: error during execution of trigger 'SCOTT.TRI_WORK'可是我把触发器里面的select count(1) into v_count from resource where id = :new.id去掉,不检查v_count,直接执行update的时候就没有这样的错误了。。为什么阿??
      

  2.   

    建议你把表resource和resource的count字段改名,这两个是oracle的关键字,在我的机子上都是用不了的
      

  3.   

    偶把count改成了use_cnt。还是这个样子阿。。
      

  4.   

    create or replace trigger tri_work 
    after insert 
    on work
    for each row
    declare
    begin
      update  resource set count = nvl(count,0)+1 where id = :new.id;
      if  SQL%NOTFOUND then
         insert into resource (id,count) values (:new.id,1);
      end if;
    end;
    /
      

  5.   

    CREATE OR REPLACE TRIGGER SYSTEM.WORKINSERT
    AFTER INSERT OR UPDATE 
    ON SYSTEM.WORK
    REFERENCING OLD AS OLD NEW AS NEW
    declare
     
      cursor c_work is select id,count(action) l from work group by id; BEGIN
     delete from resource1;
    for v_work in c_work loop   
    insert into resource1 values (v_work.id,v_work.l);
    end loop;  
    END;
    /