flyinfj

暂无签名

  • 博客访问: 1377980
  • 博文数量: 76
  • 用 户 组: 普通用户
  • 注册时间: 1970-01-01 08:00
个人简介

鏆傛棤浠嬬粛

ITPUB论坛APP

ITPUB论坛APP



APP发帖 享双倍积分

文章分类

全部博文(76)

文章存档

2008年(4)

2007年(4)

2006年(32)

2005年(36)

我的朋友
微信关注

IT168企业级官微



微信号:IT168qiye



系统架构师大会



微信号:SACC2013

订阅
热词专题
ORACLE 变异表解决方法 2006-09-04 11:14:50

分类: Oracle

对表进行DELETE,UPDATE,INSERT操作时,所操作的表就变成了变异表,对表的行级(FOR EACH ROW)触发器中不能对该表进行DML操作。这时可以使用两个方法解决。

[@more@]

1、采用自主事物pragma autonomous_transaction解决。

CREATE OR REPLACE TRIGGER tr_name
BEFORE insert ON tab_name
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION
BEGIN
------------------------
COMMIT;
END;

2、采用两个触发器(一个表行级触发器FOR EACH ROW,一个表级触发器)和一个包来解决。

CREATE OR REPLACE PACKAGE adata AS
TYPE t_aid IS TABLE OF a.aid%TYPE INDEX BY BINARY_INTEGER;
TYPE t_ano IS TABLE OF a.ano%TYPE INDEX BY BINARY_INTEGER;
v_aid t_aid;
v_ano t_ano;
v_numEntries BINARY_INTEGER := 0;
END adata;

---------------------------------------
CREATE OR REPLACE TRIGGER tr_a
BEFORE INSERT OR UPDATE OF aid ON a
FOR EACH ROW
BEGIN
adata.v_numEntries := adata.v_numEntries + 1;
adata.v_aid(adata.v_numEntries) := :new.aid;
adata.v_ano(adata.v_numEntries) := :new.ano;
END tr_a;

----------------------------------------

CREATE OR REPLACE TRIGGER tr_b
after INSERT OR UPDATE OF aid ON a
BEGIN
v_Max CONSTANT NUMBER := 5;
v_Cur NUMBER;
v_aid a.aID%TYPE;
v_ano a.ano%TYPE;
BEGIN
FOR v_loopindex IN 1 .. adata.v_numEntries loop
v_aid := adata.v_aid(v_loopindex);
v_ano := adata.v_ano(v_loopindex);
SELECT count(*) INTO v_cur FROM a WHERE aid = v_aid;
IF v_cur > v_maxs THEN
RAISE_APPLICATION_ERROR(-20000,
'Too many students for major ' || v_aid||
'because of student ' || v_ano);
END IF;
END LOOP;
END tr_b;

阅读(1365140) | 评论(2) | 转发(4) |
给主人留下些什么吧!~~

majuthink2014-12-30 09:49:07

其实有个最简单的方法就是在变异表上建一个视图,然后在视图上建触发器来解决变异表不能进行DML操作问题,2007年我个帖子也是遇到这个问题最后就是用这种方法解决的

爱在重庆2014-03-19 16:42:44

写的很全面

评论热议
请登录后评论。

登录 注册