如何正确操作Oracle视图:查询与DML限制

在这里插入图片描述

1. 视图的查询与DML操作

  • 对视图的访问包括查询和受限制的DML操作。访问视图的方法与访问表的基本相同。可以使用SELECT语句从视图中查询数据:
    SELECT * FROM view_1;   -- 代码编号 [000141]
    
  • 如果需要向视图中插入数据,也可以执行INSERT语句:
    INSERT INTO view_1 VALUES ('MARY', 1000, 200);   -- 代码编号 [000142]
    
  • 在对视图进行DML操作时,这种访问被转化为对基表的访问,因此必须遵守基表上的约束。如果插入的数据不满足基表的约束条件,系统会抛出错误。例如,尝试插入上述数据时,如果view_1的基表emp要求empno列不为空且唯一,但插入的empno值为空或与现有记录冲突,就会出现类似如下的错误:
    ORA-01400:无法将NULL插入(SCOTT.EMP.EMPNO)
    

2. 视图上的DML操作限制

  • 在某些情况下,视图上的DML操作会受到限制。例如,一个视图可能只允许进行查询而不允许进行插入或更新操作。下面创建的view_2,将查询员工表中部门号为30或20且工资大于2000的员工姓名、工资和奖金:
    CREATE OR REPLACE VIEW view_2 AS SELECT ename, sal, comm FROM emp WHERE deptno=30 or deptno=20 AND sal>2000;  -- 代码编号 [000143]
    
  • 对该视图执行查询操作,可以得到相应的结果:
    SELECT * FROM VIEW_2;  -- 代码编号 [000144]
    
  • 如果对视图进行UPDATE操作,例如:
    UPDATE view_2 SET sal=sal- 900;  -- 代码编号 [000145]
    
    可能导致部分数据不再满足视图的WHERE条件,从而使这些数据从视图中消失。

3. 视图中的CHECK OPTION

  • 为了防止视图中的数据因更新操作不再满足视图的条件,可以在创建视图时使用WITH CHECK OPTION。该选项会强制所有对视图的DML操作必须满足视图的WHERE子句条件:
    CREATE OR REPLACE VIEW view_2 AS SELECT ename, sal, comm FROM emp WHERE deptno=30 or deptno=20 AND sal>2000 WITH CHECK OPTION;  -- 代码编号 [000146]
    
  • 现在如果执行更新操作,使sal列的值减少900,将会触发WITH CHECK OPTION,系统会返回错误信息:
    ORA-01402:视图WITH CHECK OPTION违反WHERE子句
    

4. 复杂视图的定义与使用

  • 复杂视图是指在创建视图时,SELECT子句涉及多个表的操作,或者对表的列进行了表达式运算。对于复杂视图,可以执行查询操作,有时也可以执行DML操作。创建复杂视图时,必须为每一列指定列名。例如,以下语句创建了一个包含工资最大值、最小值和总和的视图:
    CREATE OR REPLACE VIEW view_3 (deptno, max_sal, min_sal, sum_sal) AS SELECT deptno, max(sal), min(sal), sum(sal) FROM emp GROUP BY deptno;  -- 代码编号 [000148]
    
  • 另一个例子是涉及两个表的视图:
    CREATE OR REPLACE VIEW view_4 (empno, ename, dname, sal, comm) AS SELECT emp.empno, emp.ename, dept.dname, sal*1.1, comm FROM emp, dept WHERE emp.deptno=dept.deptno;  -- 代码编号 [000149]
    
  • 对于复杂视图,通常不允许进行DML操作。例如,尝试在view_4中插入数据将导致系统出错:
    INSERT INTO view_4 VALUES (9999, 'Kate', 'daddress', 2000, 200);  -- 代码编号 [000150]
    

5. 视图上DML操作的总结

  • 对于简单视图,如果基表的所有列都包含在视图中,或者至少主键列和所有不允许为空的列都包含在视图中,且没有使用复杂的SELECT语句(如DISTINCTGROUP BY等),可以在此视图上执行DML操作,如插入、删除、修改。
  • 对于涉及多个基表的复杂视图,如果视图中的列是从多个表中选择或进行复杂运算的,通常不允许执行DML操作。

非常感谢您读到这里!如果您觉得这篇文章对您有帮助,可以关注一下博主。关注后,您将第一时间获得最新的AI、云计算、运维(Linux、数据库,容器等)技术,以及更多实用的技能干货。




学习成功人士的经验,提供全面的学习资源和社群支持,多种副业选择,总有一个适合你。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周同学的技术栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值