触发器五(建立INSTEAD OF触发器)

news/2024/11/26 3:49:48/

数据库技术学习 https://www.itkc8.com

INSTEAD OF触发器

对于简单视图,可以直接执行INSERT,UPDATE和DELETE操作
但是对于复杂视图,不允许直接执行INSERT,UPDATE和DELETE操作。
为了在具有以上情况的复杂视图上执行DML操作需要征用触发器来完成

--创建复杂视图

复制代码

CREATE OR REPLACE VIEW v_emp20AS
SELECT e.empno,e.ename,e.job,e.sal,d.deptno,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno=d.deptno;
--查看视图
SELECT * FROM user_views;

复制代码

 

INSTEAD OF触发器可以实现更新视图时多个数据表一起更新的问题

复制代码

instead-of触发器创建语法
CREATE [OR REPLACE] TRIGGER 触发器名称INSTEAD OF [INSERT | UPDATE | UPDATE OF 列名称 [,列名称,...] | DELETE] ON 视图名称[FOR EACH ROW][WHEN 触发条件][DECLARE][程序声明部分 ;]BEGIN程序代码部分 ;END [触发器名称] ;

复制代码

替代触发器创建时不需要使用BEFORE或者AFTER,而将其替换为INSTEAD OF,同时操作的对象也有表替换为视图

 

示例一、创建一个insert替代触发器用于执行图添加操作

复制代码

create or replace trigger view_insert_tiggerinstead of insert on v_emp20  for each row
declarev_empCount       NUMBER;v_deptCount      NUMBER;
begin--判断要增加的员工是否存在SELECT COUNT(empno) INTO v_empCount FROM emp WHERE empno=:NEW.empno;--判断要部门是否存在SELECT COUNT(deptno) INTO v_deptCount FROM dept WHERE deptno=:new.deptno;--如果员工不存在IF v_empCount=0 THENINSERT INTO emp(empno,ename,job,sal,deptno)VALUES(:new.empno,:new.ename,:new.job,:new.sal,:new.deptno);END IF;--如果部门不存在IF v_deptCount=0 THENINSERT INTO dept(deptno,dname,loc)VALUES(:new.deptno,:new.dname,:new.loc);END IF;
end view_insert_tigger;
--添加数据
INSERT INTO v_emp20(empno,ename,job,sal,deptno,dname,loc)
VALUES(7777,'张三丰','CLERK',800,77,'活动部','深圳');

复制代码

示例二、创建一个update替代触发器用于执行视图更新操作

复制代码

create or replace trigger view_update_tiggerINSTEAD OF update on v_emp20  for each row
declarebeginUPDATE emp SET ename=:new.ename,job=:new.job,sal=:new.sal WHERE empno=:NEW.empno;UPDATE dept SET dname=:new.dname,loc=:new.loc WHERE deptno=:new.deptno;
end view_update_tigger;
UPDATE v_emp20 SET ename='任我行',sal=2000,dname='魔教' WHERE empno=7777;
COMMIT;
--查询
SELECT * FROM v_emp20;

复制代码

示例三、创建一个DELETE替代触发器用于执行视图的删除操作

复制代码

create or replace trigger view_delete_tiggerinstead of delete on v_emp20  for each row
declarev_empCount          NUMBER;
BEGIN--判断员工是否存在SELECT COUNT(empno) INTO v_empCount FROM emp WHERE empno=:old.empno;--如果员工存在IF v_empCount>0 THENDELETE FROM emp WHERE empno=:old.empno;END IF;end view_delete_tigger;--执行删除
DELETE FROM v_emp20 WHERE empno=7777;
COMMIT;
--查询
SELECT * FROM v_emp20;
SELECT * FROM emp;

复制代码

示例四、将以上三个合为一个

复制代码

create or replace trigger view20emp_triggerinstead of INSERT OR UPDATE OR DELETE on v_emp20  for each row
declarev_empCount            NUMBER;v_deptCount            NUMBER;
BEGINIF inserting THEN--判断要增加的员工是否存在SELECT COUNT(empno) INTO v_empCount FROM emp WHERE empno=:NEW.empno;--判断要增加的部门是否存在SELECT COUNT(deptno) INTO v_deptCount FROM dept WHERE deptno=:new.deptno;--员工不存在就增加IF v_empCount=0 THEN   INSERT INTO emp(empno,ename,job,sal,deptno)VALUES(:new.empno,:new.ename,:new.job,:new.sal,:new.deptno);END IF;--如果部门不存在IF v_deptCount=0 THENINSERT INTO dept(deptno,dname,loc)VALUES(:new.deptno,:new.dname,:new.loc);END IF;ELSIF updating THENUPDATE emp SET ename=:new.ename,job=:new.job,sal=:new.sal WHERE empno=:NEW.empno;UPDATE dept SET dname=:new.dname,loc=:new.loc WHERE deptno=:new.deptno;ELSIF deleting THEN--判断员工是否存在SELECT COUNT(empno) INTO v_empCount FROM emp WHERE empno=:old.empno;--如果员工存在IF v_empCount>0 THENDELETE FROM emp WHERE empno=:old.empno;END IF;ELSENULL;END IF;end view20emp_trigger;

复制代码

执行增加、修改、删除

复制代码

--添加数据
INSERT INTO v_emp20(empno,ename,job,sal,deptno,dname,loc)
VALUES(7777,'张三丰','CLERK',800,77,'活动部','深圳');
--查询
SELECT * FROM v_emp20;
UPDATE v_emp20 SET ename='任我行',sal=2000,dname='魔教' WHERE empno=7777;
COMMIT;
--查询
SELECT * FROM v_emp20;
--执行删除
DELETE FROM v_emp20 WHERE empno=7777;
COMMIT;
--查询
SELECT * FROM v_emp20;
SELECT * FROM emp;

复制代码

当视图中包含以下结构之一,就表示为不可更新的视图,都不允许直接执行DML操作

1)具有集合操作符(UNION,UNION ALL,INTERSECT,MINUS);
2)具有分组函数(MIN,MAX,SUM,AVG,COUNT等)统计函数;
3)具有GROUP BY,CONNECT BY或START WITH等子句,HAVING 子句;
4)具有DISTINCT关键字;
5)具有连接查询(集合运算连接)

6)CASE 或者DECODE 语句

数据库技术学习 https://www.itkc8.com


http://www.ppmy.cn/news/520083.html

相关文章

C#基础进阶

十一、LINQ数据访问技术 LINQ查询表达关键字 关键字功能from指定要查找的数据源及范围变量,多个from字句则表示从多个数据源查找数据select指定查询要返回的目标数据,可以指定任何类型,甚至是匿名类型where指定元素的筛选条件,多…

Oracle JSON_ARRAYAGG()函数的排序失效问题

引入: 在实际操作中,俺写了这样一个Funtcion: FUNCTION fun_get_xxx(v_param_one VARCHAR2) RETURN CLOB ASv_OUTPUT CLOB;BEGINWITH temp_table AS (SELECT * FROM (( SELECT one.action_id,two.log_timeFROM table_one oneLEFT JOIN table…

魅族魅蓝u30详细打开Usb调试模式的方法

在我们使用安卓手机通过数据线连接上pc的时候,或者使用的有些APP比如我们公司营销团队在使用的APP引号精灵,之前的老版本就需要开启USB调试模式下使用,不过,现在新版本不需要了,如果手机没有开启USB调试模式&#xff0…

基于U-Net的的图像分割代码详解及应用实现

摘要 U-Net是基于卷积神经网络(CNN)体系结构设计而成的,由Olaf Ronneberger,Phillip Fischer和Thomas Brox于2015年首次提出应用于计算机视觉领域完成语义分割任务。(其发表U-Net的作者建议该模型能够很好的应用于生物…

U-net复现pytorch版本 以及制作自己的数据集并训练

GitHub链接: GitHub - milesial/Pytorch-UNet: PyTorch implementation of the U-Net for image semantic segmentation with high quality images 论文链接: https://arxiv.org/pdf/1505.04597v1.pdf 复现: 1.从GitHub下载源码以后&…

ESXi6.7安装U-NAS

一、准备安装ESXI 二、下载U-NAS 可以去官网下载:https://downloads.u-nas.cn/download/U-NAS_4.0.6_X86-64_ZH_DVD_build202003062.iso 下载U-NAS OS 3.0.9 ISO安装包,标准版的即可。 三、ESXi创建U-NAS环境 1、打开虚拟机管理web界面,点…

汉字常用字unicode码表

utf-8码表中所有汉字的区间的正则表达式 [\u4e00-\u9fa5] 汉字常用字unicode码表: String base "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97 \u4e5f\u…

U-Net网络详解

U-Net: Convolutional Networks for Biomedical Image Segmentation 原文地址:https://zhuanlan.zhihu.com/p/43927696 前言 U-Net是比较早的使用全卷积网络进行语义分割的算法之一,论文中使用包含压缩路径和扩展路径的对称U形结构在当时非常具有创新…