首页 >

Oracle中变异表处理办法

数据库|mysql教程Oracle中变异表处理办法
Oracle变异表,Oracle中变异表处理办法,数据库,O
数据库-mysql教程
shop 4.0 源码 下载,vscode项目名,ubuntu删除文件命令,tomcat工具,sqlite 单例,网页设计色彩搭配,asp数据库是否存在,万网dns服务器地址,jquery 下拉菜单插件,前端轻量级框架,南京爬虫信息,php转义字符,论坛seo优化,springboot样式,科讯标签在哪个目录,医院门户网站模板,网页背景图片不循环代码,中文博客网页模板,如何制作网站后台,bootstrap登录页面最简单的,asp.net管理系统源码下载,atm的java程序lzw
在Oracle数据库中,变异表是当前被DML语句修改的表。而对于数据库上的triggrt(触发器)来说,变异表就是trigger在其上定义的表。需
asp.net 企业网站源码下载,vscode 优势,手机ubuntu rom,tomcat 8.52,sqlite 保存音乐,构建数据库服务器,idetools 易语言ide插件支持库,前端框架themlef 引入,爬虫 手机app,php攻城狮,seo课程培训机构,微博网站源码,怎么看网站后台网页尺寸,网站下载织梦模板,好看的html5表单页面,jsp社区管理系统论文,破解程序的源代码lzw
echarts 示例源码下载,ubuntu中下载qq,tomcat 安装包安装,爬虫中text,php项目开发实习,seo自动生成工具seo顾问lzw

Oracle变异表

在Oracle数据库中,变异表是当前被DML语句修改的表。

而对于数据库上的triggrt(触发器)来说,变异表就是trigger在其上定义的表。

需要明确的是trigger中SQL语句不能进行如下操作:   

1)读或者修改触发语句的任何变异表,包括触发表本身。   

2)读或者修改触发表的约束表中的主关键字,唯一关键字和外部关键字。   

而除此之外的其他列都可以修改。   

如何突破变异表?   

方法一是用两个触发器,一个行级的,一个语句级的(速度快,推荐!)   

方法二是用dbms_job.run包(但运行的时间过长,2秒左右)   

方法三是可以使用AutoCommit方法解决(但破坏了事务的一致性,多数情况下是错误的)。

下面是包 + 行级触发器 + 语句级触发器的实例:

在使用Oracle行级触发器时,如果需要对本表进行DML操作(包括select),,一般都会报错:

ORA-04091: 表 /**TABLENAME**/ 发生了变化,触发器/函数不能读···

一般可以使用“ 包 + 行级触发器 + 语句级触发器 ”组合使用来解决。

// 创建包

CREATE OR REPLACE PACKAGE BRPMS.FXYDATA AS
TYPE T_COL1 IS TABLE OF BRPMS.TB_RISK_FXY.GUID%TYPE INDEX BY BINARY_INTEGER;
V_GUID T_COL1;
V_ROW BINARY_INTEGER := 0;
END;

// 创建行级触发器

CREATE OR REPLACE TRIGGER BRPMS.T_IFFXYMODIFIED
BEFORE UPDATE OF FXFXJDON BRPMS.TB_RISK_FXY
FOR EACH ROW
BEGIN
IF :NEW.JHLX = ‘1’ THEN
IF :NEW.FXFXJD = ‘已发布’ THEN
BRPMS.FXYDATA.V_ROW := BRPMS.FXYDATA.V_ROW + 1;
BRPMS.FXYDATA.V_GUID(BRPMS.FXYDATA.V_ROW) := :NEW.GUID;
END IF;
END IF;
END;

// 创建语句级触发器

CREATE OR REPLACE TRIGGER BRPMS.T_COPY_Y2R
AFTER UPDATE OF FXFXJD ON BRPMS.TB_RISK_FXY
DECLARE
S_YJHID BRPMS.TB_RISK_FXY.GUID%TYPE;
S_RJHID BRPMS.TB_RISK_FXY.GUID%TYPE;
BEGIN
FOR V_LOOP IN 1 .. BRPMS.FXYDATA.V_ROW LOOP
S_YJHID := BRPMS.FXYDATA.V_GUID(V_LOOP);
SELECT (SELECT F.GUID FROM BRPMS.TB_RISK_FXY F WHERE F.TDJH_ID = R.GUID)
INTO S_RJHID
FROM (SELECT * FROM BRPMS.TB_RISK_TDJH WHERE JHLX = 1) Y,
(SELECT * FROM BRPMS.TB_RISK_TDJH WHERE JHLX = 2) R
WHERE Y.YXTJHBH = R.YJHZJ
AND EXISTS
(SELECT FXY.GUID
FROM BRPMS.TB_RISK_FXY FXY
WHERE FXY.TDJH_ID = R.GUID)
AND Y.GUID =
(SELECT F.TDJH_ID FROM BRPMS.TB_RISK_FXY F WHERE F.GUID = S_YJHID)
AND ROWNUM = 1;
IF S_RJHID IS NOT NULL THEN
BRPMS.P_COPY_Y2R_MANUAL(S_YJHID, S_RJHID);
END IF;
END LOOP;
END;


Oracle中变异表处理办法
  • Oracle中变异表(ORA-04091)处理方法两则
  • Oracle中变异表(ORA-04091)处理方法两则 | Oracle中变异表(ORA-04091)处理方法两则 ...