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' 不管插入多少条记录,都有一条没执行更新操作!
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' 不管插入多少条记录,都有一条没执行更新操作!
oracle 里 if 语句= 和== 是一样的吧我的触发器确实执行了, 只是插入两行更新了一行
去掉commit;后报错:ora-06519 检测到活动的自治事物处理,已经退回
触发器中自治事务必须显示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;
你这个我运行试了试,但是结果和我的一样插入了两行符合if条件的数据,但是只更新了一行XXXX