【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
Oracle触发器
一、定义:
在触发事件发生时隐式自动运行的(PL/SQL)程序块。触发器不能接收参数,不能被别的程序、函数等调用。
二、构成:
触发器名称
触发器的触发事件
触发器的限制条件
触发器执行语句
DML触发器触发事件:
表插入、表更新、表删除
触发器触发时机:
BEFORE AFTER
触发器种类:
1.语句级触发器:
语句级触发器在每个数据修改语句执行后只调用一次,而不管这一操作将影响到多少行。
摘自百科: 例:创建一个orderdetails_tablelog表及一个AFTER触发器,用于记录是哪些用户删除了orderdetails表中的数据及删除的时间。
CREATE TABLE orderdetails_tablelog
(
WHO VARCHAR2(40),
OPER_DATE DATE
);
CREATE OR REPLACE TRIGGER DELE_ORDERDETAILS
AFTER DELETE ON ORDERDETAILS
BEGIN
INSERT INTO ORDERDETAILS_TABLELOG
(WHO, OPER_DATE)
VALUES
(USER, SYSDATE);
在该触发器被触发后,尽管一次删除多条记录,但触发器只执行一次插入操作。
2.行级触发器
行级触发器是按触发语句所处理的行激发的,可以引用受到影响的行值。创建触发器时采用关键字FOR EACH ROW
这种访问是通过两个相关的标识符实现的
:old :用于存放未进行修改前的数据
:new :用于存放进行修改后的数据
3.级联触发器
把一个数据库触发器的动作与另一个触发器联系起来,使之触发另一个触发器。
三、语法:
CREATE [OR REPLACE] TRIGGER trigger_name --触发器名字
{BEFORE | AFTER | INSTEAD OF} triggering_event --触发事件
[WHEN trigger_condition] --限制条件
[FOR EACH ROW] --行级触发
trigger_body; --执行语句体
语法说明:
trigger_name是触发器的名称。
triggering_event说明了激发触发器的事件(也可能包括特殊的表或视图)。
trigger_body是触发器的代码。
如果在WHEN子句中指定trigger_condition的话,则首先对该条件求值。触发器主体只有在该条件为真值时才运行。
DML触发器是针对某个表进行DML操作时触发的。
DML = Data manipulation language(数据操纵语言)
详细语法格式:
CREATE [ OR REPLACE ] TRIGGER trigger_name
{ BEFORE | AFTER }
{ INSERT | DELETE | UPDATE [OF column[,column…] ] } ON { table_name | view_name}
[ REFERENCING
{ OLD [AS] old_name | NEW [AS] new_name } ]
[ FOR EACH ROW ]
[ WHEN trigger_condition ]
trigger_body;
四、例子
create or replace trigger "TRI_SA_UPDATE"
after update on xx_table (BEFORE INSERT ON)
for each row
declare
-- local variables here
begin
IF :NEW.NUM_VALUE <> :OLD.NUM_VALUE THEN
XXX
END IF;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001, '',TRUE);
end TRI_SA_UPDATE;
来源:oschina
链接:https://my.oschina.net/u/1014520/blog/675350