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;
/

原文地址:https://www.cnblogs.com/jinxf/p/9166155.html