11.2.6 INSTEAD OF类型触发器
在该类型的触发器作用下,如果对作用对象执行DML操作,那么该操作会被触发器的内部操作所取代。触发器作用在视图当中,用于解决视图不可更新的问题。至于什么样的视图不可更新,读者可以参考第9章。
【示例11】INSTEAD OF触发器的使用
该示例将演示利用INSTEAD OF触发器解决视图的不可更新问题。实现步骤如下:
1)创建视图。具体脚本如下:
CREATE VIEW PRODUCTINFO_VIEW AS—-视图
SELECT DISTINCT PRODUCTNAME,PRODUCTPRICE,QUANTITY,CATEGORY,ORIGIN
FROM PRODUCTINFO;
【执行效果】
在SQL*Plus下执行脚本,如果成功,则提示如下:
视图已创建
2)创建触发器。具体脚本如下:
01 CREATE TRIGGER INSTEAD_OF_TGR—触发器
02 INSTEAD OF INSERT ON PRODUCTINFO_VIEW
03 DECLARE
04 CATEGID VARCHAR2(10);—产品类型编码
05 BEGIN
06 SELECT CATEGROYID
07 INTO CATEGID
08 FROM CATEGROYINFO
09 WHERE CATEGROYINFO.CATEGROYNAME=:NEW.CATEGORY;
10 DBMS_OUTPUT.PUT_LINE('——-'||CATEGID);
11 INSERT INTO PRODUCTINFO
12 VALUES
13 ('0240090001',
14 :NEW.PRODUCTNAME,
15 :NEW.PRODUCTPRICE,
16 :NEW.QUANTITY,
17 CATEGID,
18 '测试',
19 :NEW.ORIGIN);
20 END;
21 /
【代码解析】
❑第1~2行表示创建替代类型的触发器作用在视图PRODUCTINFO_VIEW上,触发事件为增加事件,触发器名称为INSTEAD_OF_TGR。
❑第4行表示声明变量,用做存储产品类型编码。
❑第6~9行表示根据输入的产品类型名称查询产品类型编码,并把该值存入CATEGID中。这步操作有可能引发异常,前面章节都已有相关介绍,为了方便这里不再给出。
❑第11~19行表示向表PRODUCTINFO中增加数据,该操作是这个触发器的主要操作。这部分的SQL语句替换了针对视图的增加操作,达到了解决视图不可更新的目的。其中的14、15、16、19行使用了对执行视图DML操作语句中的值。
【执行效果】
在SQL*Plus下执行脚本,如果成功,则提示如下:
触发器已创建
【验证触发器】
以上步骤操作完成,可以对视图执行增加操作。SQL脚本如下:
INSERT INTO PRODUCTINFO_VIEW VALUES('触发器测试',1000,0,'雨具','中国');
该脚本执行成功后,对PRODUCTINFO表进行查询,查看该触发器是否成功把数据添加到里面。增加数据以及查询结果如图11.14所示。
图 11.14 替代触发器验证过程
从图11.14中标示部分可以看出已经把数据插入到表PRODUCTINFO中。其中CATEGORY字段值对应CATEGROYID表中的雨具编码。需要注意的是,该类型的触发器只能用做行级的触发。