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),例如下例:
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 触发器简介的更多相关文章
- Oracle数据库之PL/SQL程序设计简介
PL/SQL程序设计简介 一.什么是PL/SQL? PL/SQL是 Procedure Language & Structured Query Language 的缩写. ORACLE的SQL ...
- [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...
- Oracle数据库之PL/SQL触发器
Oracle数据库之PL/SQL触发器 1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是 ...
- ORACLE数据库之PL/SQL触发器、rownum、动态SQL、数据库之视图与索引
WHEN子句说明触发约束条件.Condition为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL函数.WHEN子句指定的触发约束条件只能用在BEFORE和AFTER行 ...
- PL/SQL编程基础(一):PL/SQL语法简介(匿名PL/SQL块)
PL/SQL PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言. SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环).而PL/ ...
- ORACLE PL/SQL:触发器
ORACLE PL/SQL 触发器 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8 ...
- Oracle学习笔记十 使用PL/SQL
PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...
- 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》
本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...
- Oracle PL/SQL
PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...
随机推荐
- 关于用xercesImpl包解析xml文件遇中文报错问题
今天在运行项目时报错: Caused by: org.apache.xerces.impl.io.MalformedByteSequenceException: 3 字节 UTF-8 序列的字节 3 ...
- USB枚举的详细流程
附一个很好的枚举过程的详细流程: ◆ 用户将一个USB设备插入USB端口,主机为端口供电,设备此时处于上电状态.◆ 主机检测设备.◆ 集线器使用中断通道将事件报告给主机.◆ 主机发送Get_Port_ ...
- QT5.1.1中MinGW4.8的环境变量配置
1.右击“我的电脑”图标,在弹出的菜单上选择“属性(R)”菜单项. 2.选择“高级”选项卡.点击“环境变量”按钮. 3.点击“新建(W)”按钮,新建环境变量:MINGW_HOME,变量值为MinGW的 ...
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 ...
- 用SharedPreferences保存List(Map(String, String))数据
原因: SharedPreferences没有保存数组的方法,但是有时候为了保存一个数组而进行序列化,或者动用sqlite都是有点杀猪焉用牛刀的感觉,所以就自己动手改进一下吧. 解决方案: 采用的方式 ...
- APUE读书笔记-第18章-终端I/O
18.1 引言 *终端I/O的用途很广泛,包括用于终端.计算机之间的直接连线.调制解调器以及打印机等等,所以终端I/O系统非常复杂 18.2 综述 *终端I/O有两种不同的工作模式: (1)规范模式输 ...
- CONCATENATION 引发的性能问题
背景是在一台11gR2的机器上,开发反映一个批处理比以前慢了3倍.经过仔细查看该SQL的执行计划,发现由于SQL中使用了or,导致CBO走出了一个非常糟糕的CONCATENATION路径. no_ex ...
- 【HDOJ】2780 Su-Su-Sudoku
模拟+DFS. /* 2780 */ #include <cstdio> #include <cstring> #include <cstdlib> ][]; ][ ...
- Spark RDD Persistence
Spark最为重要的特性之一就是可以在多个操作(Action)之间,将一个或多个RDD关联的数据集(Dataset)以分区(Partition)为单位进行持久化(Persist)或缓存(Cache), ...
- poj 2484 A Funny Game(博弈)
A Funny Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4639 Accepted: 2855 Desc ...