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.2.6 INSTEAD OF类型触发器 - 图1

图 11.14 替代触发器验证过程

从图11.14中标示部分可以看出已经把数据插入到表PRODUCTINFO中。其中CATEGORY字段值对应CATEGROYID表中的雨具编码。需要注意的是,该类型的触发器只能用做行级的触发。