1.6.2 如何对视图进行访问

对视图的访问包括查询和受限制的DML操作。访问视图的方法与访问表的方法基本相同。例如,要查询视图view_1,可以执行下面的SELECT语句:


SELECT*FROM view_1;


如果要向视图view_1中插入一行,可以执行下面的INSERT语句:


INSERT INTO view_1 VALUES('MARY',1000,200)


在访问视图时,这种访问被转化为对基表的访问,所以在视图上执行DML操作时,也要遵守基表上的约束。上述INSERT语句在执行时系统将会出错,错误信息是:ORA-01400:无法将NULL插入(“SCOTT”.“EMP”.“EMPNO”),发生错误的原因是这行数据违反了基表的主键约束。在这一行数据中只提供了姓名、工资和奖金三列的值,而主键列deptno没有对应的数据,所以就违反了基表上的主键约束。

现在我们来考察对视图的DML操作进行限制的情况的情况。假设我们以下面的语句创建了视图view_2:


CREATE OR REPLACE VIEW view_2 AS

SELECT ename, sal, comm FROM emp

WHERE(deptno=30 or deptno=20)AND sal>2000;


对这个视图进行查询操作时,将得到一些结果:


SQL>SELECT*FROM VIEW_2;

ENAME SAL COMM

JONES 2975

BLAKE 2850

AAAA 3000


如果再对视图view_2进行一次UPDATE操作,那么再次查询的结果将有所不同:


SQL>UPDATE view_2 SET sal=sal-900;


已更新3行。


SQL>SELECT*FROM VIEW_2;

ENAME SAL COMM

JONES 2075

AAAA 2100


查询的结果表明,执行UPDATE语句之后,有一行数据因为sal列的数据不满足创建视图时WHERE子句中指定的条件,从而在视图中消失了。为了防止这种情况,我们可以在创建视图时使用WITH CHECK OPTION,例如,下面的语句重新创建视图view_2:


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;


那么现在再执行以前的UPDATE语句时,系统将会出错,错误信息为:


ORA-01402:视图WITH CHECK OPTION违反WHERE子句


这就相当于为视图增加了一个约束,当对视图进行DML操作时,数据必须满足WHERE子句中指定的条件。