Oracle 触发器

徘徊边缘 提交于 2019-12-10 19:55:51

【推荐】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;

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!