- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
行级别触发器中的相关标识符
行级别触发器:触发语句处理每一行时,行级别触发器都执行一次
CREATE OR REPLACE TRIGGER 触发器名
[AFTER/BEFORE] INSERT OR DELETE OR UPDATEOF 字段名 ON 表名
[WHEN trigger_condition] [FOR EACH ROW]
DECLARE
… …
END 触发器名
[练习]不管 UPDATE 命令涉及多少条记录,以下触发器只触发一次CREATE OR REPLACE TRIGGER TgOnStudents
AFTER UPDATE ON STUDENTS DECLARE
BEGIN
Insert into log_table (info) values (‘TgOnStudents 基于 STUDENTS 表,每次触发代码只执行一次。’); END;
执行以下命令查看效果
UPDATE STUDENTS SET CURRENT_CREDITS = 4 WHERE ID = 10000; UPDATE STUDENTS SET CURRENT_CREDITS = 4 WHERE ID 10006;
[练习]以下触发器,UPDATE 涉及多少条记录,代码就执行多少遍CREATE OR REPLACE TRIGGER TgOnRoom
AFTER UPDATE ON ROOMS FOR EACH ROW
DECLARE BEGIN
Insert into log_table (info) values (‘TgOnRoom 基于 STUDENTS 表,UPDATE 涉及几条记
录就执行几遍’); END;
执行以下命令查看效果
UPDATE ROOMS SET NUMBER_SEATS = 100 WHERE ROOM_ID = 20000; UPDATE ROOMS SET NUMBER_SEATS = 100 WHERE ROOM_ID 20005;
行级别触发器:触发语句处理每一行时,行级别触发器都执行一次,在触发器内部,你可以访问当前被处理行中的数据。:old 和 :new 其类型均为 triggering_table%ROWTYPE;
通过 :new.field 来引用指定字段的值(其作用相当于索引中的游标变量)。
触发语句INSERT UPDATE DELETE
:old
未定义,所有字段都为 NULL
更新前行的原始值 行被删除前的原始值
:new
当语句完成时,将要被插入的值当语句完成时,将要被更新的值未定义,所有字段都为 NULL
※WHEN 子句
可以通过设置 WHEN 子句来控制行级别触发器的执行,即并不是对于每次更改都触发,只有满足条件的更改动作才触发,主要是在WHEN 里面对:new 或:old 各字段的值进行判断。
WHEN 子句和 FOR EACH ROW 子句的作用:对于影响到的每一行,如果满足WHEN 的要求则执行一遍触发器代码。
[例子]当对 students 表的 current_credits 字段进行修改之前,如果该字段新的值超过 20 分, 写提示信息。
CREATE OR REPLACE TRIGGER CheckCredits
BEFORE INSERT OR UPDATEOF current_credits ON students FOR EACH ROW
WHEN (new.current_credits20) BEGIN
DBMS_OUTPUT.PUT_LINE(‘该生新的学分数为’|| :new.current_credits || ’,超过 20 分
了’); END;
修改 students 表 ID 为 10000 的学生的 current_credits 的值,改为 21。update students set current_credits = 21 where ID=10000;
注意:在 WHEN 子句中使用 new 不要加: ,在 BEGIN 部分中使用时要加: 即为:new
[练习] 建触发器 CheckSeatsNumber 当对 rooms 表的 number_seats 字段进行修改之前
(INSERT 或 UPDATE),如果其职大于 300,显示提示信息,***楼宇***号房间座位数是***,是不是输入错误?写触发器,执行下列命令: update rooms set number_seats=301 where room_id=20000; 看看效果。
。
※ 从:old 和 :new 中获取修改前后的值,存入备份信息表中。
[例子]记录 registered_students 表的每一次修改,将信息记入 RS_audit
文档评论(0)