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

有些操作可以在程序中控制。例如在插入某个表时,写个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),例如下例:

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

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

BEFORE | AFTER

INSERT | DELETE | UPDATE

FOR EACH ROW | FOR EACH STATEMENT

请自由组合。

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

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

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

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

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

PL/SQL 触发器简介的更多相关文章

  1. Oracle数据库之PL/SQL程序设计简介

    PL/SQL程序设计简介 一.什么是PL/SQL? PL/SQL是 Procedure Language & Structured Query Language 的缩写. ORACLE的SQL ...

  2. [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

    原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...

  3. Oracle数据库之PL/SQL触发器

    Oracle数据库之PL/SQL触发器 1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是 ...

  4. ORACLE数据库之PL/SQL触发器、rownum、动态SQL、数据库之视图与索引

    WHEN子句说明触发约束条件.Condition为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL函数.WHEN子句指定的触发约束条件只能用在BEFORE和AFTER行 ...

  5. PL/SQL编程基础(一):PL/SQL语法简介(匿名PL/SQL块)

    PL/SQL PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言. SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环).而PL/ ...

  6. ORACLE PL/SQL:触发器

    ORACLE PL/SQL 触发器 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8 ...

  7. Oracle学习笔记十 使用PL/SQL

    PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...

  8. 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》

    本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...

  9. Oracle PL/SQL

    PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...

随机推荐

  1. BZOJ 3595: [Scoi2014]方伯伯的Oj SBT+可持久化Treap

    3595: [Scoi2014]方伯伯的Oj Time Limit: 6 Sec  Memory Limit: 256 MBSubmit: 102  Solved: 54[Submit][Status ...

  2. .NET framework Chart组件SeriesChartType 枚举

      成员名称 说明   Area 面积图类型.   Bar 条形图类型.   BoxPlot 盒须图类型.   Bubble 气泡图类型.   Candlestick K 线图类型.   Column ...

  3. 如何监控 Nginx?

    什么是 Nginx? Nginx("engine-x")是一个 HTTP 和反向代理服务器,同时也是一个邮件代理服务器和通用的 TCP 代理服务器.作为一个免费开源的服务器,Ngi ...

  4. 【POJ1470】Closest Common Ancestors

    Description Write a program that takes as input a rooted tree and a list of pairs of vertices. For e ...

  5. c++ RAII 资源管理就是初始化

    RAII:(Resource Acquisition Is Initialization),也就是“资源获取就是初始化”,是C++语言的一种管理资源.避免泄漏的惯用法.C++标准保证任何情况下,已构造 ...

  6. ClassNotFoundException

    在 java socket 通信,使用 ObjectInputStream 的 readObject 时, 出现了问题. ServerProject 问题描述是这样的: java.lang.Class ...

  7. 判断iis是否已经安装

    判断iis是否已经安装? 访问http://127.0.0.1 能得到正确页面的是已经安装. 活者查看控制面板-添加删除程序-windows组件-internet信息服务(IIS)前面的没有打勾则没有 ...

  8. UVA1416 Warfare And Logistics

    UVA1416 Warfare And Logistics 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36232 [ ...

  9. UVa1607 poj1435 UVaLive1686 Gates

    填坑系列(p.246) 由函数连续性得满足二分性 #include<cstdio> #include<cstring> #include<cstdlib> #inc ...

  10. 转:实现Java Web程序的自动登录

    有很多Web程序中第一次登录后,在一定时间内(如2个小时)再次访问同一个Web程序时就无需再次登录,而是直接进入程序的主界面(仅限于本机).实现这个功能关键就是服务端要识别客户的身份.而用Cookie ...