oracle之视图
视图
13.1 为什么使用视图
1)限制数据的存取:用户只能看到基表的部分信息。方法:赋予用户访问视图对象的权限,而不是表的对象权限。
2)使得复杂的查询变得容易(内联视图):
3)提供数据的独立性
13.2 简单视图和复杂视图
特性 简单视图 复杂视图
--------------------------------------------
表的个数 一个 一个或多个
含函数 无 有
含组函数 无 有
含DISTINCT 无 有
DML操作 可以 不一定
13.2 语法
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY];
13.2.1 FORCE作用:可以先建视图,后建基表
create force view view1 as select * from test1;
13.2.2 WITH CHECK OPTION作用:对视图where子句进行约束,使视图结果集保持稳定。
SQL>create view view2 as select * from emp where deptno=10 with check option;
insert 不许插入非10号部门的记录
update 不许将10号部门修改为其他部门
13.2.3 WITH READ ONLY作用:禁止对视图执行DML操作
SQL>create view view3 as select * from emp where deptno=10 with read only;
13.2.4 关于视图注意事项(考点)
1)只要视图中的数据不是来自基表的原始数据,就尽量不要对该视图做DML操作。
2)视图的DML操作
含有如下情况,则不能删除视图中的数据:
含有聚合函数
含有GROUP BY 子句
含有 DISTINCT 关键字
含有ROWNUM 这个伪列
含有如下情况,不能修改该视图中的数据:
上面提到的任何一种情况。
列是由表达式来进行定义的
含有如下情况,不能增加该视图中的数据:
上面提到的任何一种情况。
在基表中包含有 NOT NULL约束的列,然而该列并没有在视图中出现
13.3 复杂视图的更新,键保留表概念。
select * from user_views
-----------------------------------------------------------------------------
如果建立了视图 想查看其中的定义,可以访问如下视图dba_views中的text字段(long型);
自建一pl/sql过程,参照一下。
declare
v_text dba_views.text%type;
v_name dba_views.view_name%type;
begin
select text, view_name into v_text,v_name FROM dba_views WHERE view_name='V1';
dbms_output.put_line(v_name||' define is :'||v_text);
end;
/