zoukankan      html  css  js  c++  java
  • PL/SQL 触发器简介

    与公司同事交流了一下,得知触发器很少用。性能是一方面,主要是如果用太多触发器,可能到时你都不知道会有什么操作自动发生。

    有些操作可以在程序中控制。例如在插入某个表时,写个log表的记录。这可以用触发器实现,但比较好的做法还是在程序中写个插入到log的语句实现。

    所以,就只学习了很简单的部分。

    触发器的通用语法如下:

    CREATE [OR REPLACE] TRIGGER Trigger_name

    {BEFORE | AFTER } {INSERT | DELETE | UPDATE} ON TABLE_NAME

    [FOR EACH ROW]

    [FOLLOWS another_trigger]

    [ENABLE | DISABLE]

    [WHEN condition]

    DECLARE

    BEGIN

    END;

    注意触发器的body是一个代码块,中间不用IS或AS连接。

    触发器体包括伪记录:NEW和:OLD,分别表示将要从内存中读出处理的记录和将要被处理的记录。对INSERT来说,:NEW表示要插入的记录,没有:OLD。其他的不再赘述。但是在触发器头的WHEN条件中,:NEW和:OLD要将前面的冒号:去掉。

    默认的触发器是语句级的,加了FOR EACH ROW之后就变成行级的。

    一般来说,触发器是基于表的。可以使用INSTEAD OF触发器来修改视图,但不建议这么做。因为修改视图可能会修改到底层的表,造成误操作什么的。

    目前见过的触发器的使用,是在插入到表前,判断:NEW的主键值是不是为空,如果是则填充(使用SEQUENCE),例如下例:

     1 create or replace trigger t_gkey
     2 before insert on example
     3 for each row
     4 begin
     5   if :NEW.gkey is null or :NEW.gkey = 0 then --可对新记录判断
     6      :NEW.gkey := s_gkey.nextval --如果主键不符合要求,可对新记录操作
     7   end if;
     8 exception
     9   when others then raise_application_error(-20000,'Trigger t_gkey Error');
    10 end;
    11       

    理论上可以有12个类型的触发器。

    BEFORE | AFTER

    INSERT | DELETE | UPDATE

    FOR EACH ROW | FOR EACH STATEMENT

    请自由组合。

    有三个布尔函数,INSERTING, DELETING, UPDATING。用来标示当前事件(相应的布尔函数的值为TRUE,否则为FALSE)。

    在DML语句失败的情况下,主事务会回滚,触发器产生的事务也跟着回滚。如果不想回滚触发器产生的事务,可将其设置为自治事务

    语法为在Declare中添加PRAGMA AUTONOMOUS_TRANSACTION;并在最后添加COMMIT;

     1 create or replace trigger t_gkey
     2 before insert on example
     3 for each row
     4 declare
     5     pragma autonomous_transaction; --添加
     6 begin--可能本例不太正确,但语法是这样没错啦
     7   if :NEW.gkey is null or :NEW.gkey = 0 then --可对新记录判断
     8      :NEW.gkey := s_gkey.nextval --如果主键不符合要求,可对新记录操作
     9   end if;
    10   commit;--添加
    11 exception
    12   when others then raise_application_error(-20000,'Trigger t_gkey Error');
    13 end;
    14       

    不要花太多时间在触发器上,那不是最重要的。

  • 相关阅读:
    KMP算法代码实现记录
    冒泡,插入,希尔,快速,归并,桶排序,堆排序算法汇总实现
    回溯法个人理解记录(C#八皇后)
    C#创建初始化链表的方式(个人目前写出3种创建的方式)
    算法汇总代表性学习记录
    C#集合去重
    C#获取数组/字符串的k个字符的全部组合
    pl/sql简单执行记录个人学习记录
    oracle为什么尽量不要使用外键的最好理解
    PickerController 添加照片---iOS
  • 原文地址:https://www.cnblogs.com/kingsleylam/p/3283976.html
Copyright © 2011-2022 走看看