行级触发器和语句级触发器
Posted zy18755122285
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了行级触发器和语句级触发器相关的知识,希望对你有一定的参考价值。
1、 行级触发器对DML语句影响的每个行执行一次。(:NEW 和:OLD使用方法和意义,new 只出现在insert和update时,old只出现在update和delete时。在insert时new表示新插入的行数据,update时new表示要替换的新数据、old表示要被更改的原来的数据行,delete时old表示要被删除的数据。)
2、 语句级触发器对每个DML语句执行一次,如果一条INSERT语句在TABLE表中插入500行,那么这个表上的语句级触发器只执行一次,而行级的触发器就要执行500次了。
3、 insert 语句级触发器定义语法
语法如下:
CREATE ORREPLACE TRIGGER trigger_name
[AFTER | BEFORE] INSERT ON table_name
DECLARE
Localdeclarations
BEGIN
Body writtenPL/SQL
END;
语句级和行级触发器在语法上关键的不同在于:
FOR EACH ROW字句。在行级触发器中指定这个子句而语句级触发器中不需要指定。
1)、WHEN(Boolean expression) 所有行触发器可用
2)、OF column_name clause 仅对update触发器可用
在语句级触发器中:
引用:NEW.COLUMN_NAMEand :OLD.COLUMN_NAME是不正确的。
不能使用When(booleanexpression)子句中包含OLD.COLUMN_NAME和 NEW.COLUMN_NAME.
可以使用下面的语句:
CREATE ORREPLACE TRIGGER temp_biuds
BEFORE INSERT ORUPDATE OR DELETE ON TEMP
BEGIN
CASE
WHEN insertingTHEN
PL/SQL code here
WHEN updatingTHEN
PL/SQL code here
WHEN deletingTHEN
PL/SQL code here
END CASE;
END;
4、 创建INSTEAD OF触发器需要注意以下几点:
只能被创建在视图上,并且该视图没有指定WITH CHECK OPTION选项。
不能指定BEFORE 或 AFTER选项。
FOR EACH ROW子可是可选的,即INSTEAD OF触发器只能在行级上触发、或只能是行级触发器,没有必要指定。
没有必要在针对一个表的视图上创建INSTEAD OF触发器,只要创建DML触发器就可以了。
创建触发器的一般语法是:
CREATE [ORREPLACE] TRIGGER trigger_name
INSTEAD OF
INSERT | DELETE |UPDATE [OF column [, column …]]
[OR INSERT |DELETE | UPDATE [OF column [, column …]]...]
ON [schema.]view_name --只能定义在视图上
[REFERENCING OLD[AS] old | NEW [AS] new| PARENT as parent]
[FOR EACH ROW ] --因为INSTEAD OF触发器只能在行级上触发,所以没有必要指定
[WHEN condition]
PL/SQL_block |CALL procedure_name;
实例:
--行级别触发器
create or replace trigger mytrig
before insert on student
foreach row
declare
begin
select to_char(SEQ_T_RS_YW_YLJYDMX.nextval) into :new.id from dual;
end mytrig;
--数据插入验证
insert intostudent(STUDENT.name,STUDENT.age) values('zhangsan',20)
insert intostudent(STUDENT.name,STUDENT.age) values('lisi',21)
insert intostudent(STUDENT.name,STUDENT.age) values('zhouliu',21)
--插入特殊的数据验证
insert intostudent values('7','lisi',21)
--查询结果
SELECT * FROMSTUDENT
--语句级别触发器
CREATE OR REPLACETRIGGER mytrig_one
AFTERINSERT ON students
DECLARE
BEGIN
updatestudents
set students.id = to_char(SEQ_T_RS_YW_YLJYDMX.nextval)
wherestudents.id is null;
END mytrig_one;
--从其他表中读取数据进行数据验证
insert intostudents(students.name,students.age) select st.sname,st.sage fromwkj_student st
--查询结果
SELECT * FROMSTUDENTS
以上是关于行级触发器和语句级触发器的主要内容,如果未能解决你的问题,请参考以下文章