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子句中指定的条件。