行级触发器和语句级触发器

Posted zy18755122285

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了行级触发器和语句级触发器相关的知识,希望对你有一定的参考价值。

1、   行级触发器对DML语句影响的每个行执行一次。(:NEW :OLD使用方法和意义,new 只出现在insertupdate时,old只出现在updatedelete时。在insertnew表示新插入的行数据,updatenew表示要替换的新数据、old表示要被更改的原来的数据行,deleteold表示要被删除的数据。

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

 


以上是关于行级触发器和语句级触发器的主要内容,如果未能解决你的问题,请参考以下文章

oracle 触发器学习

触发器使用教程和命名规范

Oracle触发器实例(网搜)

触发器使用教程和命名规范

ORACLE触发器

Oracle中触发器有几种,用法与SQL Server一样吗?谢谢