最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

Oracle变异表触发器中ORA-04091错误原因及解决方案

来源:懂视网 责编:小采 时间:2020-11-09 10:34:58
文档

Oracle变异表触发器中ORA-04091错误原因及解决方案

Oracle变异表触发器中ORA-04091错误原因及解决方案:Oracle变异表触发器中ORA-04091错误原因及解决方案 变异表是指激发触发器的DML语句所操作的表 当对一个表创建行级触发器时,有下列两条限制: 1.不能读取或修改任何触发语句的变异表;2.不能读取或修改触发表的一个约束表的PRIMARY KEY,UNIQ
推荐度:
导读Oracle变异表触发器中ORA-04091错误原因及解决方案:Oracle变异表触发器中ORA-04091错误原因及解决方案 变异表是指激发触发器的DML语句所操作的表 当对一个表创建行级触发器时,有下列两条限制: 1.不能读取或修改任何触发语句的变异表;2.不能读取或修改触发表的一个约束表的PRIMARY KEY,UNIQ

Oracle变异表触发器中ORA-04091错误原因及解决方案

变异表是指激发触发器的DML语句所操作的表

当对一个表创建行级触发器时,有下列两条限制:

1.不能读取或修改任何触发语句的变异表;
2.不能读取或修改触发表的一个约束表的PRIMARY KEY,UNIQUE 或FOREIGN KEY关键字的列, 但可以修改其他列

例如:有这样一个需求:在更新员工所在部门或向部门插入新员工时,部门中员工人数不超过7人

如果按照下面的触发器写就会使UPDATE操作时报错

CREATE OR REPLACE TRIGGER updatetrigger
BEFORE UPDATE ON EMP
FOR EACH ROW
DECLARE
v_num NUMBER;
BEGIN
SELECT count(*) INTO v_num FROM emp
WHERE deptno = :new.deptno;
IF (v_num > 7) THEN
RAISE_APPLICATION_ERROR(-20001,
'员工数多于'||v_num);
END IF;
END updatetrigger;

ORA-04091: 表 SCOTT.EMP 发生了变化, 触发器/函数不能读它
ORA-06512: 在 "SCOTT.UPDATETRIGGER", line 4
ORA-04088: 触发器 'SCOTT.UPDATETRIGGER' 执行过程中出错

如果既想更新变异表,同时又需要查询变异表,那么如何处理呢?

将行级触发器与语句级触发器结合起来,,在行级触发器中获取要修改的记录的信息,存放到一个软件包的全局变量中,然后在语句级后触发器中利用软件包中全局变量信息对变异表的查询,并根据查询的结果进行业务处理

例如:

为了实现在更新员工所在部门或向部门插入新员工时,部门中员工人数不超过7人,可以在emp表上创建两个触发器,同时创建一个共享信息的包

CREATE OR REPLACE PACKAGE mutate_pkg
AS
v_deptno NUMBER(2);
END;

CREATE OR REPLACE TRIGGER rmutate_trigger
BEFORE INSERT OR UPDATE OF deptno ON EMP
FOR EACH ROW
BEGIN
mutate_pkg.v_deptno:=:new.deptno;
END;

CREATE OR REPLACE TRIGGER smutate_trigger
AFTER INSERT OR UPDATE OF deptno ON EMP
DECLARE
v_num number(3);
BEGIN
SELECT count(*) INTO v_num FROM emp
WHERE deptno = mutate_pkg.v_deptno;
IF v_num>7 THEN
RAISE_APPLICATION_ERROR(-20003,'这部门的员工太多了 '||
mutate_pkg.v_deptno);
END IF;
END;

这样操作,就不会报ORA-04091: 表SCOTT.EMP 发生了变化,触发器/函数不能读它错误了。

相关阅读:

Oracle触发器的使用

Oracle触发器给表自身的字段重新赋值出现ORA-04091异常

Oracle创建触发器调用含参数存储过程

Oracle触发器查询统计本表

linux

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

文档

Oracle变异表触发器中ORA-04091错误原因及解决方案

Oracle变异表触发器中ORA-04091错误原因及解决方案:Oracle变异表触发器中ORA-04091错误原因及解决方案 变异表是指激发触发器的DML语句所操作的表 当对一个表创建行级触发器时,有下列两条限制: 1.不能读取或修改任何触发语句的变异表;2.不能读取或修改触发表的一个约束表的PRIMARY KEY,UNIQ
推荐度:
标签: 原因 错误 error
  • 热门焦点
专题
Top

抖音扫码关注

手机端二维码

每天分享百科知识!