之前发了帖子
有表table如下: 
id name code  element version 
1  aa    11    ee      0 
2  bb    22    ee      0 
现在想做到:在新增,修改表中的id,name 等值的时候,那条数据的version字段每修改一次+1 
新的需求是,version字段每次都要取表中的最大值+1
create or replace trigger trig_pubtable
before insert or update on t_pubtable
for each row
declare 
versions t_pubtable.version%type  default 0;begin
select max(version) into versions from t_pubtable;
:NEW.version := versions+1;END;
如上的存储过程,语法上找不出问题,但是执行的时候那条select 语句那里过不去,也没有提示具体原因
头疼,我用的oracle10g,不知道和版本有没有关系
再麻烦大家了

解决方案 »

  1.   

    我测试是触发器是PASS
    但是更新语句,一更新就出错:提法ora-04098
    这样子的触发器达不到触发的效果!
      

  2.   

    好像针对本表的触发器内,是不能对本表进行操作的,包括对本表的查询操作,至少目前我知道的是这样的.在触发器中只能得到NEW.的值,对其它表进行操作
      

  3.   

    你那trigger怎么里面光一个select?  
      

  4.   

    给你一个例子  你简单修改下就能达到你的要求
    DROP TRIGGER EM.TRI_EMS_BOX_AF_INS;CREATE OR REPLACE TRIGGER EM."TRI_EMS_BOX_AF_INS" AFTER
    INSERT ON "EM"."EMS_BOX" FOR EACH ROW
    DECLARE
        VN_TASK_ID NUMBER;
    BEGIN
        VN_TASK_ID := 0;
        SELECT KEY_SEQ_NUM INTO VN_TASK_ID FROM CANP.TABLE_KEY_SEQ WHERE T_NAME='EMS_BOX_TA';
        VN_TASK_ID := VN_TASK_ID + 1;
        INSERT INTO EM.EMS_BOX_TA(TASK_ID, BOX_ID, BOX_CODE, TASK_TYPE, REFE_TYPE, MODI_STAT, PURPOSE, REWORK, REWORK_STAT) VALUES(VN_TASK_ID, :NEW.BOX_ID, :NEW.BOX_CODE, 'BOXINST', 'E', '0', 'A', 'N', 0);
        UPDATE CANP.TABLE_KEY_SEQ SET KEY_SEQ_NUM = VN_TASK_ID WHERE T_NAME='EMS_BOX_TA';
    END;
      

  5.   

    建议,在程序端进行判断好了!不在数据库上进行处理!select max(vesssion)+1 into 变量  from 表 where 条件
    insert into table(session) values(变量)
      

  6.   

    PRAGMA AUTONOMOUS_TRANSACTION轻松解决楼主的问题。即便是UPDATE也不会报错;create or replace trigger trig_pubtable 
    before insert or update on t_pubtable 
    for each row 
    declare 
    PRAGMA AUTONOMOUS_TRANSACTION;
    versions t_pubtable.version%type  default 0; 
    begin 
    select max(version) into versions from t_pubtable; 
    :NEW.version := versions+1; END; 
    /
      

  7.   

    查了资料,这样子写的触发器,有可能会出现以下情况:ORA-06519 – 检查到活动自治事务,回滚——退出自治事务时没有提交、回滚或DDL操作ORA-14450 – 试图访问正在使用的事务级临时表ORA-00060 – 等待资源时检查到死锁
      

  8.   

    行级表的trigger,由于事务的关系,
    是不能在这里使用任何对该表进行查询 修改,添加和删除的动作的。
      

  9.   


    用PRAGMA AUTONOMOUS_TRANSACTION; 自制事务是一种方法,