建立触发器时,触发器类型为after insert ,函数
在begin中事务
Select fieldA into v_a from tableA;it
执行到此句时,会出错:io
--弹出错误信息提示 table
--ORA-04091:表tr_table发生了变化触发器/函数不能读它 扩展
--ORA-06512: 在iu_table line 2 date
--ORA-04088: 触发器iu_table 执行过程当中出错 数据
问题分析:异常
在Oracle中执行DML语句的时候是须要显示进行提交操做的。当咱们进行插入的时候,会触发触发器执行对触发器做用表和扩展表的种种操做,可是这个时候触发器和插入语句是在同一个事务管理中的,所以在插入语句没有被提交的状况下,咱们没法对触发器做用表进行其余额外的操做。若是执行其余额外的操做则会抛出如上异常信息。tab
解决方案:
出错的缘由是由于触发器和DML语句在同一事务管理中,因此方案一即是将触发器和DML语句分红两个单独的事务处理。这里可使用Pragma autonomous_transaction; 告诉Oracle触发器是自定义事务处理。
Declare
pragma autonomous_transaction;
begin
-------
--这里须要显示提交事务
Commit;
End;
同时,触发器不能更新触发条件所在的行。
例如:
Create or replace trigger tri_A
After insert on tableA
For each row
Declare
pragma autonomous_transaction;
begin
update tableA set fieldA=1 where id=:new.id;
end;
当你插入数据时,会发现,这个update语句有执行,却不生效。
而后想改成:new.fieldA= 1,执行后,报错:
ORA-04084:没法更改此触发器类型的new值
这时候,要更换策略了,不过,也得根据我的需求了,
恰好个人需求能够经过更新触发器类型after insert 为before insert