create or replace trigger t_sn_disorder
after insert on sms_mo_message_info2
for each rowdeclare
var1 varchar2(20);
PRAGMA AUTONOMOUS_TRANSACTION;beginvar1:=:new.time_stamp;if :new.smscontent ='0000' then 
update sms_mo_message_info2 set flag='xxxx' where time_stamp=var1;
commit;
else null;
end if;
end;说明: 表sms_mo_message_info2 包含time_stamp字段 这个触发器只涉及这个表sms_mo_message_info2 
问题是,当插入一条smscontent ='0000' 的数据时,触发器没有更新 flag='xxxx' 
当插入第二条数据时 更新了上一条记录的 flag='xxxx' 不管插入多少条记录,都有一条没执行更新操作!

解决方案 »

  1.   

    if :new.smscontent ='0000' then  是不是应该if :new.smscontent == '0000' then  
      

  2.   


    oracle 里 if 语句= 和== 是一样的吧我的触发器确实执行了, 只是插入两行更新了一行
      

  3.   


    去掉commit;后报错:ora-06519 检测到活动的自治事物处理,已经退回
      

  4.   

    原因:
    触发器中自治事务必须显示commit 或者rollback
    你第一次插入一条smscontent ='0000' 的数据时,触发器没有更新 flag='xxxx',是因为你的where time_stamp=:new.time_stamp 不成立,所以没更新到
    第二次插入时候,where条件满足,得到更新flag此问题主要是由于你代码里面有两条分路 if ..else..  所以你必须在else null 此分路也要显示commit或者rollbackcreate or replace trigger t_sn_disorder
    after insert on sms_mo_message_info2
    for each rowdeclare
    var1 varchar2(20);
    PRAGMA AUTONOMOUS_TRANSACTION;beginvar1:=:new.time_stamp;if :new.smscontent ='0000' then  
    update sms_mo_message_info2 set flag='xxxx' where time_stamp=var1;
    commit;
    else 
    commit;
    end if;end;
      

  5.   

    你的trigger中用到了自治事务,外面insert的那条记录在trigger里面状态的表是没有那条纪录的,所以对于第一条记录来说, where time_stamp=var1 是不会成立的。oracle的绝大多数类型的trigger都不支持dml原表,建议将此逻辑改到trigger外边去吧。
      

  6.   


    你这个我运行试了试,但是结果和我的一样插入了两行符合if条件的数据,但是只更新了一行XXXX