我想要在用户sst下的表data上的t_count字段上实现自增,建立序列和触发器如下:
序列seq_abc建好之后,我的触发器的语句如下:
creat or replace trigger trigger_abc after insert on sst.data for each row begin select seq_abc.nextval into :new.t_count from dual;
end;然后告诉我是:ora-04084:无法更改此触发器类型的new值;我上网搜了一下,说是把after改为before就可以了,可是我就是想实现after的功能,就是在插入之后实现自增,请问
begin 
select seq_abc.nextval into :new.t_count from dual;
end;部分应该怎么改啊。
或是整个应该怎么弄

解决方案 »

  1.   

    不能使用after,行级触发器后不可改变:new
      

  2.   

    就用你的before trigger就可以解决你序列新增的需求
    如果你想用after trigger  那么你可以考虑 自治事务
      

  3.   

    最后补充一点!
    after trigger 无法解决你这个需求,个人认为是这样的,因为是after触发器,不管你在触发器中做了什么动作,最后外层的insert触发语句始终是执行在最后,就算用自治事务实现,也达不到你要的结果
    我测试了一下
    create or replace trigger trigger_name
    after insert on case
    for each row
    declare
    pragma autonomous_transaction;
    v_name varchar2(10);
     begin
          --select name into :new.name from gar where id=:new.id;
          --DBMS_OUTPUT.PUT_LINE(':NEW.ID----'||:NEW.ID||'  :NEW.NAME----'||:NEW.NAME);
          select name into v_name from gar where id=:new.id;
          update case set name=v_name where id=:new.id;
          --DBMS_OUTPUT.PUT_LINE('v_name----'||v_name);
          commit;
     exception when NO_DATA_FOUND THEN
          null;
          --DBMS_OUTPUT.PUT_LINE(':NEW.ID----'||:NEW.ID||'  :NEW.NAME----'||:NEW.NAME);
     end;
    触发动作:insert into case values(3,'xxxxx',sysdate);最后:SQL> select * from case;        ID NAME       DT
    ---------- ---------- -----------
             3 xxxxx      2010-6-12 1SQL> 之所以未更新到name字段,是因为你触发动作最后执行,又将其更改过来了
    至于你这个需求  直接用before trigger 就达到你的需求了!over!