oracle触发器使用:after insert 与before insert的简单使用注意
2014-11-24 15:43
489 查看
创建触发器时,触发器类型为after insert ,
在begin中
Select fieldA into v_a from tableA;
执行到此句时,会出错:
--弹出错误信息提示
--ORA-04091:表tr_table发生了变化触发器/函数不能读它
--ORA-06512: 在iu_table line 2
--ORA-04088: 触发器iu_table 执行过程中出错
问题分析:
在Oracle中执行DML语句的时候是需要显示进行提交操作的。当我们进行插入的时候,会触发触发器执行对触发器作用表和扩展表的种种操作,但是这个时候触发器和插入语句是在同一个事务管理中的,因此在插入语句没有被提交的情况下,我们无法对触发器作用表进行其他额外的操作。如果执行其他额外的操作则会抛出如上异常信息。
解决方案:
出错的原因是因为触发器和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
在begin中
Select fieldA into v_a from tableA;
执行到此句时,会出错:
--弹出错误信息提示
--ORA-04091:表tr_table发生了变化触发器/函数不能读它
--ORA-06512: 在iu_table line 2
--ORA-04088: 触发器iu_table 执行过程中出错
问题分析:
在Oracle中执行DML语句的时候是需要显示进行提交操作的。当我们进行插入的时候,会触发触发器执行对触发器作用表和扩展表的种种操作,但是这个时候触发器和插入语句是在同一个事务管理中的,因此在插入语句没有被提交的情况下,我们无法对触发器作用表进行其他额外的操作。如果执行其他额外的操作则会抛出如上异常信息。
解决方案:
出错的原因是因为触发器和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
相关文章推荐
- oracle触发器使用:after insert 与before insert的简单使用注意
- (转)oracle触发器使用:after insert 与before insert的简单使用注意
- 浅析Java执行外部命令的几个要点(1)——简单的使用范例以及在Cygwin上的注意点
- SQL SERVER 2005:在After Insert触发器中使用INSERT后,影响SCOPE_IDENTITY 问题
- MySQL-LAST_INSERT_ID();使用注意事项
- 关于安卓HTTP的API简单使用和实战中要注意的问题
- 【MySQL笔记】last_insert_id()函数使用的注意事项
- 使用ObjectDataSource注意DeleteMethod、UpdateMethod、Insert等方法中参数的命名约定
- Signalr简单入门,使用注意点
- python的subprocess的简单使用和注意事项
- JavaScript之appendChild、insertBefore和insertAfter使用说明
- NYOJ-284简单BFS注意下优先队列的使用就可以了
- 使用python的flask新建一个简单的站点前做的注意事项
- C++中引用的简单介绍与使用注意
- 使用MERGE语句,这里简单总结一下 (一个语句解决update 和 insert 功能)
- insert_iterator 类的简单使用
- 使用ObjectDataSource注意DeleteMethod、UpdateMethod、Insert等方法中参数的命名约定
- 简单入门的Oracle触发器使用