度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 1365|回复: 3
打印 上一主题 下一主题

[分享] ORACLE 变异表解决方法

[复制链接]

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
跳转到指定楼层
楼主
发表于 2020-6-22 21:19:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

对表进行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;


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

348

主题

3572

帖子

9327

积分

论坛元老

Rank: 8Rank: 8

积分
9327
沙发
发表于 2020-6-24 23:51:34 | 只看该作者
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

348

主题

3572

帖子

9327

积分

论坛元老

Rank: 8Rank: 8

积分
9327
板凳
发表于 2020-6-24 23:52:08 | 只看该作者
楼主是越来越牛了
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
地板
 楼主| 发表于 2020-6-25 21:59:21 | 只看该作者
万望 发表于 2016-7-24 23:52
楼主是越来越牛了

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-11-24 12:56 , Processed in 0.126391 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表