变异表是一个当前正在改变的表,正在执行DML语句的表,改变可以是因为INSERT、UPDATE或DELETE语句,或者由于DELETE CASCADE约束。这种错误类型只会在行级触发器上发生,当表在改变时,不能对表进行查询或修改,如果读取或者修改这个表,就会导致变异表错误。
这里给出一个书中例子,对SECTION表执行INSERT或者UPDATE语句之前,该触发器会检查指定教师是否承担太多的班级的教学任务,如果某个教师所承担班级数量等于或大于10,则触发器会抛出一个错误信息,说明教师所教授班级太多。
1 CREATE OR REPLACE TRIGGER section_biu
2 BEFORE INSERT OR UPDATE ON section
3 FOR EACH ROW
4 DECLARE
5 v_total NUMBER;
6 v_name VARCHAR2(30);
7 BEGIN
8 SELECT COUNT(*)
9 INTO v_total
10 FROM section
11 WHERE instructor_id =:NEW.instructor_id;
12 IF v_total >=10 THEN
13 SELECT first_name||' '||last_name
14 INTO v_name
15 FROM instructor
16 WHERE instructor_id = :NEW.instructor_id;
17 RAISE_APPLICATION_ERROR
18 (-20000,'Instructor, '||v_name||', is overbooked');
19 END IF;
20 EXCEPTION
21 WHEN NO_DATA_FOUND THEN
22 RAISE_APPLICATION_ERROR
23 (-20001,'This is not a valid instructor');
24 END;
当对SECTION表执行下面语句时
UPDATE section
SET instructor_id =101
WHERE section_id =80;
执行该语句后会出现ORA-04091错误。
解决该错误三种方法:
1、利用自治事务
在第5行插入PRAGMA AUTONOMOUS_TRANSACTIONBEGIN
在第24行插入COMMIT
2、利用包和拆分触发器
利用PL/SQL包声明两个全局变量记录教师ID和名字
CREATE OR REPLACE PACKAGE instructor_adm AS
v_instructor_id instuctor.instructor_id%TYPE
v_instructor_name varchar2(40);
END;
修改已有的触发器section_biu,不需要声明部分,执行部分修改为
IF :NEW.instructor_id IS NOT NULL THEN
BEGIN
instructor_adm.v_instructor_id:= :NEW.instructor_id;
SELECT first_name||' '||last_name
INTO instructor_adm.v_instructor_name
FROM instructor
WHERE instructor_id = instructor_adm.v_instructor_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR
(-20001,'This is not a valid instructor');
END:
END IF;
再为section表创建一个新触发器,一个语句级触发器
CREATE OR REPLACE TRIGGER section_aiu
AFTER INSERT OR UPDATE ON section
DECLARE
v_total INTEGER;
BEGIN
SELECT COUNT(*)
INTO v_total
FROM section
WHERE instructor_id = instructor_adm.v_instructor_id;
IF v_total >=10 THEN
RAISE_APPLICATION_ERROR
(-20000,'Instructor, '||instructor_adm.v_instructor_name||', is overbooked');
END IF;
END:
之所以要这样做就是因为保证了表在发生改变完成后去查询,这样才不会出现错误。
3、使用复合触发器
这样可以不需要在包里声明全局变量,只需要在触发器中定义局部变量记录教师ID和名字,然后在复合触发器的BEFORE EACH ROW IS部分和AFTER STATEMENT IS部分,这两部分内容分别与方法2中两个不同触发器相类似。
分享到:
相关推荐
### 变异表基本概念与应用 #### 一、变异表定义及作用 **变异表**,是指在数据库中由DML(Data Manipulation Language,数据操纵语言)语句(如`INSERT`、`UPDATE`、`DELETE`等)所直接影响的表。当涉及到触发器...
ArcGIS 教程:经验半变异函数 经验半变异函数是 ArcGIS 中的一种重要概念,它用于分析和量化空间依赖性(又称空间自相关)。在本教程中,我们将学习如何创建经验半变异函数、经验半变异函数的分组、不同方向的经验...
Oracle数据库中的变异表错误通常出现在行级触发器的使用过程中,这种错误是由于触发器试图在自身执行的过程中访问正在被修改的数据所导致的。当触发器试图读取或修改正在被其自身触发的操作所影响的表时,就会抛出这...
变异函数教程是Surfer软件中提供的一种指南,旨在帮助用户理解和应用变异函数(Variogram),这是地质统计学中用于表征空间数据连续性或粗糙度的一个重要工具。变异函数不仅能够揭示数据集在空间上的结构特征,而且...
变异函数在地质学、环境科学、气象学等领域有着广泛的应用,因为它能够提供关于数据空间分布的详细信息,帮助我们理解数据的变异特性,并利用这些信息进行更准确的空间插值和预测。克里金方法结合变异函数,能够有效...
这些数据被用于表1至表3中,通过对比分析不同样本中各级筛孔通过百分率的最大值、最小值以及变化范围,来评估沥青混合料级配的变异性。 除此之外,文章强调了矿质混合料的配合比设计对于级配的影响,指出不同的混合...
考虑到文档的标题是“高二生物基因表达和变异练习”,我们可以推测,文档内容涉及到的是高中生物课程中关于基因表达和基因变异的知识点。在提供的部分内容中,虽然存在一些扫描错误和信息不完整的问题,但我们可以...
随着技术的进步和创新需求的增加,设计师越来越多地采用变异设计的方法,以产生更优化的结构方案。本文将重点探讨在机械产品设计中工作表面变异设计的相关内容,揭示其在提升机械性能方面的重要作用。 在弹簧零件的...
染色体变异是生物学中的一种重要变异类型,它涉及到染色体数量或结构的变化,而这些变化往往会导致生物体遗传信息的改变。在高中生物课程中,染色体变异是基因突变及其他变异的重要组成部分,它包括染色体结构变异...
【系统变异】是第二语言习得领域中的一个重要概念,它涉及到学习者在使用目标语言时出现的不规则或非标准的语言形式变化。这种变异可能是由于多种因素,包括社会因素、心理语言因素以及学习者自身的语言发展阶段。在...
【标题】: 一种基于变异真值表故障模型的神经网络测试生成算法 【摘要】: 该文提出了一种针对逻辑门功能异常的新型故障模型,即变异真值表故障模型,并结合遗传优化的神经网络测试生成算法,旨在解决传统测试生成...
在临床路径中,医生和护士按照预定的时间表和步骤进行诊疗活动。然而,实际情况中,由于多种因素,可能会出现临床路径的变异,这被称为临床路径变异。本文将详细探讨临床路径变异的几个主要类别,以及如何分析和处理...
1. **染色体结构变异**:染色体结构变异是指染色体上的基因数量增加或减少,不涉及基因内部结构的变化。例如,题目中的选项C正确地指出这种变化属于染色体结构的变异。染色体结构变异包括缺失、重复、倒位和易位等...
染色体变异 染色体变异是指生物体细胞中染色体数量或结构的变化。染色体变异可以影响生物体的形态、生理和生态特征。在生物体中,染色体数量的变化可以通过多倍体、单倍体和染色体结构变化来实现。 一、多倍体 ...
例如,某公司的用户使用的连续 3 个月的使用流量状况,如表所示: | 用户 | T-3 月流量 | T-2 月流量 | T-1 月流量 | | --- | --- | --- | --- | | A0001 | 283.3 | 270.5 | 273.3 | | A0002 | 102.1 | 140.4 | 180...
【知识点详解】 1. 基因突变与表达:基因...这些知识点涵盖了生物学中的基因表达、遗传变异、DNA复制、染色体变异、性别决定、种群遗传学等多个重要领域,对于高考生物复习和理解生物的变异与进化过程具有重要意义。
本次教学设计的主题为“染色体变异”,主要针对高中生物课程,旨在帮助学生理解并掌握染色体结构和数目变异的基本概念及其影响。教学设计充分考虑了高中生的认知特点,运用多媒体资源,旨在激发学生的学习兴趣,培养...