三个触发器解决变异表错误(ORA-04091)
来源:互联网 发布:西门子数控编程软件 编辑:程序博客网 时间:2024/05/15 23:48
--创建测试表:
-- Create table
create table TEST_LIXIONG_TRIGGER_20170824
(
name1 VARCHAR2(64),
name2 VARCHAR2(256),
name3 VARCHAR2(256)
);
insert into TEST_LIXIONG_TRIGGER_20170824
select '1', 'aa', 'mm'
from dual
union all
select '2', 'bb', 'mm'
from dual
union all
select '3', 'cc', 'mm'
from dual
union all
select '4', 'dd', 'mm'
from dual;
select * from TEST_LIXIONG_TRIGGER_20170824;
--目的:
--如果TEST_LIXIONG_TRIGGER_20170824表的name3列发生变更,则更新name2列
--实现步骤
--创建包,存储变更的rowid,两个集合,一个存储变更的ROWID,另一个是空集合
create or replace package ceshi_pkg_LIXIONG is
type settype is table of rowid index by binary_integer;
set_new settype;
set_empty settype;
end ceshi_pkg_LIXIONG;
--创建BEFORE触发器(非行级触发器),每次将set_new置为空
create or replace trigger TEST_TRIGGER_bef
before update of name3 on TEST_LIXIONG_trigger_20170824
begin
ceshi_pkg_LIXIONG.set_new := ceshi_pkg_LIXIONG.set_empty;
end TEST_TRIGGER_bef;
--创建行级触发器,存储变更的ROWID
create or replace trigger TEST_TRIGGER_row
after update of name3 on TEST_LIXIONG_trigger_20170824
for each row
begin
ceshi_pkg_LIXIONG.set_new(ceshi_pkg_LIXIONG.set_new.count + 1) := :new.rowid;
end TEST_TRIGGER_row;
--创建AFTER触发器(非行级触发器)
create or replace trigger TEST_TRIGGER_aft
after update of name3 on TEST_LIXIONG_trigger_20170824
begin
for i in 1 .. ceshi_pkg_LIXIONG.set_new.count loop
update TEST_LIXIONG_trigger_20170824 a
set a.name2 = a.name2 || '_zz'
where rowid = ceshi_pkg_LIXIONG.set_new(i);
end loop;
end TEST_TRIGGER_aft;
--测试
select * from TEST_LIXIONG_trigger_20170824;
update TEST_LIXIONG_trigger_20170824 n
set n.name3 = 'nn'
where n.name1 in ('1','3');
--删除测试表、测试触发器
drop trigger TEST_TRIGGER_AFT;
drop trigger TEST_TRIGGER_BEF;
drop trigger TEST_TRIGGER_ROW;
drop table TEST_LIXIONG_TRIGGER_20170824;
drop PACKAGE CESHI_PKG_LIXIONG;
参考:http://blog.csdn.net/li19236/article/details/77542392
- 三个触发器解决变异表错误(ORA-04091)
- 触发器中ORA-04091 变异表错误原因和一般解决方法
- oracle变异表触发器中ORA-04091错误原因及解决方案
- ORA-04091变异表 ora-00060
- 触发器ORA-04091 错误
- 包含变异表(mutating table)的触发器
- Oracle中变异表(ORA-04091)处理方法两则
- Oracle中针对一张表建立触发器,并且触发器也处理同一张表的数据(ora-04091 错误)
- ORA-04091错误解决
- ORA-04091错误解决
- oracle中变异表触发器的处理。
- 行级触发器相关的变异表
- Oracle中ORA-06508错误解决,触发器调用存储过程
- 通过在触发器中建立自治事务解决ORA-04091(不能读取被触发的表)
- oracle 触发器中ORA-04091原因及解决
- UNDO表空间的ORA-01110错误解决(一)
- UNDO表空间的ORA-01110错误解决(二)
- ora-14404错误解决
- Runtime的总结和应用
- 表达式树---后缀表达式转中缀表达式
- IDEA(JAVA)使用json
- 判断一棵树是否是二叉查找树
- stm32+pca9685控制舵机机械臂
- 三个触发器解决变异表错误(ORA-04091)
- MyBatis的简单使用
- Java 排序算法-归并排序
- 如何快速成为数据分析师?
- 算法系列——替换空格(剑指offer)
- 返回局部变量的指针很危险
- LintCode 159:Find Minimum in Rotated Sorted Array
- Linux--fork( )函数
- java 泛型