PLSQL入门与精通(第38章:DMLSQL语句触发器和行触发器的语法和例子)

37 篇文章 2 订阅
14 篇文章 1 订阅

今日惊蛰。
我用泥土做成片片相思的脚步,去唤醒大地下蛰伏的春意。
那丝丝挡不住的绿啊!由一声惊雷敲响了埋藏于地下的生命。

上次简单的解释了一下DML触发器的特点:
DML触发器有SQL文触发器和行触发器,SQL文触发器针对的是整个DMLSQL语句触发一次,行触发器对DML操作的每一行数据。
这次详细说明一下DML触发器的语法。

首先是“SQL文触发器”最低限度的语法:
<SQL文触发器定义语法>

1 CREATE OR REPLACE TRIGGER 触发名
2 时机
3 事件
4 ON 表名称
5 无名PL/SQL块

解释如下:
・第2行的时机指定“BEFORE”或“AFTER”。如果是BEFORE,则在DML处理之前启动触发器,如果是AFTER,则在DML处理后启动触发器。
・在第3行的事件,指的是触发器启动的DML语句,即“INSERT”、“UPDATE”、“DELETE”。
如果要启动INSERT、UPDATE、DELETE的任意操作,指定为“INSERT OR DELETE OR UPDATE”。
另外,“UPDATE”的情况下,可以指定具体列名:“UPDATE OF 列名1,列名2……”。
・在第四行中指定要设置此触发器的表的名称。
・第5行记述无名PL/SQL块,由多行程序组成。
因为是无名PL/SQL块,如果需要定义变量等,要从「DECLARE」关键字开始。
如果没有要定义的内容,就用“BEGIN”关键字开始记述。

《行触发器语法》
1 CREATE OR REPLACE TRIGGER 触发名
2 时机
3 事件
4 ON 表名称
5 FOR EACH ROW ←指定了这个的话就表示是行触发器
6 无名PL/SQL块

区别是“FOR EACH ROW”这个关键词。 在“ON表名”后面如果有“FOR EACH ROW”这个关键词的话就是行触发器,如果没有,就是SQL文触发器。
行触发器和文触发器的语法差异不大,但触发器处理的内容有很大差异。也就是说,对于行触发器,因为触发器是在DML操作的对象数据行上启动的,所以“可以参照该行的列值”。

下面介绍用行触发器利用DML操作的对象行的列值的方法,如下所示:
:OLD.列名称←DML操作前的列值 – 要在头上加冒号(:)
:NEW.列名←DML操作后的列值 – 要在头上加冒号(:)。

例如,有订单表和库存表,在订单表中输入订单数据的话,就可以减少库存表中相应产品的库存量,下面介绍这个行触发的例子。 首先是库存表:
SQL>SELECT * FROM 库存;
产品名 库存数
--------------------
电视 10
收音机 10

电视、收音机各有10台库存。

订单表:
SQL CREATE TABLE
2(产品名称 VARCHAR2(10),
3 订购数量 NUMBER(5));

订单表是只有产品名和订单数两列。
在这里,在订单表上插入一条数据->3台 电视,表示订购了3台电视,库存表的电视的库存数同时需要减少了3台,变成7台。这个就需要
订单表更新后的数据的产品名称和数量3台这2个内容,这时候就需要行触发器。

<行触发器>
SQL CREATE OR REPLACE TRIGGER 订单库存TRIG
2 AFTER INSERT ON 订单表 FOR EACH ROW
3 BEGIN
4 UPDATE 库存表
5 SET 库存数 = 库存数 - :NEW.订单数量
6 WHERE 产品名称=:NEW.产品名称;
7 END;
8 /

触发已创建。

马上确认一下吧。
往订单表里 INSERT 3台电视 。
SQL> INSERT INTO 订单表 VALES('电视’,3);
创建了一行。
订单表插入了一行数据:电视 3台。

SQL>SELECT * FROM 订单表;
产品名称 订购数量
‘--------------------
电视 3

确认库存表,电视机的库存减少了3台。
SQL>SELECT * FROM 库存;
产品名 库存数
’--------------------
电视 7 ← 库存减少了3台。
收音机 10

在3台电视的订单行上启动了上述触发器,将库存表进行了UPDATE。
在这里:NEW.产品名是“电视”,订单数是3。
因此,在触发器中执行了与以下相同的UPDAATE:
UPDATE 库存
SET 库存数 = 库存数-3
WHERE 产品名称=“电视”
由此,库存表的电视行的库存数减少了3台。

真就是行触发器的例子。

本章针对DML的SQL文触发器和行触发器的语法和例子进行了详细介绍。感谢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值