PL/SQL学习(六)触发器
原文参考:http://plsql-tutorial.com/
- CREATE [OR REPLACE ] TRIGGER trigger_name - 创建一个给定名字或者重写一个已存在的触发器
- {BEFORE | AFTER | INSTEAD OF } - 表明触发器触发时间. 比如: 修改一个表之前或者之后. INSTEAD OF 用来在一个视图上面创建触发器. before 和 after 不能用来在视图上创建触发器 .
- {INSERT [OR] | UPDATE [OR] | DELETE} - 定义触发事件. 可以使用OR关键字分隔 绑定的多个事件. 触发器将在所有绑定的这些事件发生的时候触发.
- [OF col_name] - 这个声明在 update事件触发器中使用. 当你希望只更新某一特定列时触发器才触发时,可以使用这个声明.
- [ON table_name] - 关联触发器绑定的表格或者视图.
- [REFERENCING OLD AS o NEW AS n] - 伪列,用来引用被修改数据的旧/新值. 使用时的格式:old.column_name or :new.column_name,注意!在where子句中不加前缀“:”(如:old.column_name) , old (new)也可以用其他自定义的名字代替. 插入事件中不能使用old,删除事件中不能使用new,因为他们不存在.
- [FOR EACH ROW] - 表明是每行后都触发( i.e. a Row Level Trigger) 还是整个语句执行完才触发 (i.e.statement level Trigger).
- WHEN (condition) - 仅在行级触发器里有效. 触发器仅当当前行满足when子句后的条件时才触发.
自治事务:
自治事务是由其他事务(通常被称为主事务)发起的独立事务,所谓独立,即主事务是否提交回滚对自治事务没有影响
例:
CREATE OR REPLACE TRIGGER instructor_aud
AFTER UPDATE OR DELETE ON INSTRUCTOR
DECLARE
v_type VARCHAR2(10);
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
IF UPDATING THEN
v_type := 'UPDATE';
ELSIF DELETING THEN
v_type := 'DELETE';
END IF;
UPDATE statistics
SET transaction_user = USER,
transaction_date = SYSDATE
WHERE table_name = 'INSTRUCTOR'
AND transaction_name = v_type;
IF SQL%NOTFOUND THEN
INSERT INTO statistics
VALUES ('INSTRUCTOR', v_type, USER, SYSDATE);
END IF;
COMMIT;
END;
SET phone = '7181234567'
WHERE instructor_id = 101;
1 row updated.
ROLLBACK;
SELECT *
FROM statistics;
----------- ---------- ---------------- ---------
INSTRUCTOR UPDATE STUDENT 09-MAR-08
基于视图而执行的触发语句(INSERT/UPDATE/DELETE),并且会直接修改
底层的数据库表。
UPDATE/INSERT/DELETE语句修改。
. 集合操作:如 UNION, UNION ALL, INTERSECT, and MINUS
. 分组函数:如 AVG, COUNT, MAX, MIN, and SUM
. GROUP BY 或 HAVING 语句
. CONNECT BY 或 START WITH 语句
. DISTINCT 操作符
. ROWNUM 伪列
例子:
CREATE VIEW instructor_summary_view AS
SELECT i.instructor_id, COUNT(s.section_id) total_courses
FROM instructor i
LEFT OUTER JOIN section s
ON (i.instructor_id = s.instructor_id)
GROUP BY i.instructor_id;
结果:
DELETE FROM instructor_summary_view
WHERE instructor_id = 109;
causes the error shown:
DELETE FROM instructor_summary_view
*
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view
使用INSTEAD OF 触发器:
CREATE OR REPLACE TRIGGER instructor_summary_del
INSTEAD OF DELETE ON instructor_summary_view
FOR EACH ROW
BEGIN
DELETE FROM instructor
WHERE instructor_id = :OLD.INSTRUCTOR_ID;
END;
结果:
DELETE FROM instructor_summary_view
WHERE instructor_id = 109;
1 row deleted.
注意:
当操作涉及外键时,使用INSTEAD OF触发器也有可能出错。
PL/SQL学习(六)触发器的更多相关文章
- pl/sql学习(5): 触发器trigger/事务和锁
(一)触发器简单介绍 触发器是由数据库的特定时间来触发的, 特定事件主要包括以下几种类型: (1)DML: insert, update,delete 增删改 (2)DDL: create, alte ...
- ORALCE PL/SQL学习笔记
ORALCE PL/SQL学习笔记 详情见自己电脑的备份数据资料
- Oracle之PL/SQL学习笔记
自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...
- [Oracle] PL/SQL学习笔记
-- 1. 使用一个变量 declare -- Local variables here v_name ); begin -- Test statements here select t.user_n ...
- PL\SQL学习笔记
注释 单行--多行 一.declare一般用于做变量的申明.begin 程序体开始执行 end; 程序体结束exception .. dbms_output.put_line('绝对值'||v_ab ...
- PL/SQL学习笔记之日期时间
一:PL/SQL时间相关类型 PL/SQL提供两个和日期时间相关的数据类型: 日期时间(Datetime)数据类型 时间间隔类型 二:日期时间类型 datetime数据类型有: DATE TIMEST ...
- PL/SQL学习笔记之包
一:包 包是由一组相关的函数,过程,变量,游标等PL/SQL程序设计元素的组合而成的一个PL/SQL程序单元,相当于Java中的类. 包的主要作用是封装:把相同或相似的东西归类,方便维护和管理,提高开 ...
- PL/SQL学习笔记之集合
一:PL/SQL集合 集合是一个有序且存有相同的类型数据的数据结构. PL/SQL提供了三种集合类型: 索引表(关联数组) 嵌套表 数组 二:索引表:一个索引表(也叫关联数组)是一组键 - 值对.每个 ...
- PL/SQL学习笔记之基本块格式与语法
一:PL/SQL程序块 PL/SQL是一种块结构的语言,一个PL/SQL程序就是一个 代码逻辑块. PL/SQL程序由三部分构成: 1 声明 部分 使用关键字DECLARE开头,它是一个可选的部分,用 ...
随机推荐
- CCS样式表小结
CSS(Cascading Style Sheet,叠层样式表),作用是美化HTML网页. /*注释区域*/ 此为注释语法 一.样式表 (一)样式表的分类 1.内联样式表 和HTML联合显示,控 ...
- ubuntu14.04中安装QuartusII9.1步骤
家里的计算机安装了WIN10,出于够用且安装文件小,想安装QuartusII9.1,按M$风格,驱动绝对是安不上的.正好是双系统ubuntu14.04 64位.安装过程不太顺利,记录下来,当作已经不灵 ...
- chrome扩展——Postman
今天须要測试一个http的接口,曾经都是使用java的httpClient工具jar,自己编写代码去调试,但这样的方式比較死板,每次都要执行一段代码...于是就像有没有类似的在线工具能够使用? 调查了 ...
- JSON未定义解决办法
json官网:www.json.org json2.js地址:https://github.com/douglascrockford/JSON-js/blob/master/json2.js 引入解决 ...
- jQuery动态实现title的修改 失效问题
最近做了一个网站,一切都很顺利,在上线的时候,突然发现一个严重的问题,开始面对这个问题,完全不知所措(在goole.火狐.IE9及其以上都没得问题:IE8及其低版本都失效)只是浏览器弹出一个bug,但 ...
- 获取java项目 classpath目录
this.getClass().getResource("/").getPath(); 从根目录获取载入文件: this.getClass().getResourceAsStrea ...
- AWS 命令行界面 + Python 的 AWS 开发工具包 (Boto3)
安装AWS CLI $ pip install awscli 安装Boto3 $ pip install boto3 设置AWS CLI $ aws configure AWS Access Key ...
- Hadoop的伪分布式搭建
我们在搭建伪分布式Hadoop环境,需要将一系列的配置文件配置好. 一.配置文件 1. 配置文件hadoop-env.sh export JAVA_HOME=/opt/modules/jdk1.7.0 ...
- JavaScript入门(3)
一.认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM将HTML文档呈现为带有元素.属性和文本的树结构(节点树). Eg: 将HT ...
- 常见的IE6兼容以及css兼容
IE6虽然随着XP系统退出市场在国外基本基本消失,但是在国内依然占据很大的市场份额.政务网站.页游官网等依然要考虑到IE6用户的体验.如果你的网站使用CSS3等“新技术”时,就必须果断放弃IE6的兼容 ...