视图VIEW

视图是一个虚拟表,它由存储的查询构成,可以将它的输出看做一个表。视图同真实表一样,也可以包含一系列带有名称的列和行数据。但是,视图并不在数据库中存储数据值,其数据值来自定义视图的查询语句所引用的表,数据库只在数据字典中存储视图的定义信息。

视图建立在关系表上,也可以在其他视图上,或者同时建立在两者之上。视图看上去非常像数据库中的表,甚至可以在视图中进行INSERT、UPDATE 和DELETE 操作。通过视图修改数据时,实际上就是在修改基本表中的数据。与之相对应,改变基本表中的数据也会反映到由该表组成的视图中。

创建视图

创建视图是使用 CREATE VIEW 语句完成的。为了在当前用户模式中创建视图,要求数据库用户必须具有 CREATE VIEW 系统权限;如果要在其他用户模式中创建视图,则用户必须具有CREATE ANY VIEW 系统权限,创建视图最基本的语法如下:
create [or replace] view <view_name> [alias[,alias]…) ]
as <subquery>
[with check option] [constraint constraint_name]
[with read only]
 alias:用于指定视图列的别名。
 subquery:用于指定视图对应的子查询语句。
 with check option:该子句用于指定在视图上定义的CHECK 约束。
 with read only:该子句用于定义只读视图。
在创建视图时,如果不提供视图列别名,Oracle 会自动使用子查询的列名或列别名;如果视图子查询包含函数或表达式,则必须定义列别名。 WITH READ ONLY 选项,该选项用于定义只读视图。定义了只读视图后,数据库用户只能在该视图上执行SELECT 语句,而禁止执行INSERT、UPDATE 和DELETE 语句.

管理视图

在创建视图后,用户还可以对视图进行管理,主要包括:查看视图定义、修改视图定义、重新编译视图和删除视图。

1.查看视图定义
前面介绍过,数据库并不存储视图中数值,而是存储视图的定义信息。用户可以通过查询数据字典视图USER_VIEWS,获得视图的定义信息。
【案例】使用 desc 命令查看USER_VIEWS 数据字典的结构,代码如下。
SQL> desc user_views;

在 USER_VIEWS 视图中,TEXT 列存储了用户视图的定义信息,即构成视图的SELECT 语句。来看下面的例子。
【案例】通过数据字典USER_VIEWS 查看视图user_views 的定义,代码如下。
SQL> select text from user_views
where view_name = upper('emp_view_union');

2.修改视图定义
建立视图后,如果要改变视图所对应的子查询语句,则可以执行CREATE OR REPLACE VIEW 语句,来看下面的例子。
【案例】修改视图 emp_view_union,使该视图实现查询部门编号为30 的功能(原查询信息是部门编号为20 的记录),代码及运行结果如下。
SQL> create or replace view emp_view_union as
select d.dname,d.loc,e.empno,e.ename
from emp e,dept d
where e.deptno = d.deptno and d.deptno = 30;
视图已创建
在上面代码中,起到至关重要作用的关键字是replace,它表示使用新的视图定义替换掉旧的视图定义。
3.重新编译视图
视图被创建后,如果用户修改了视图所依赖的基本表定义,则该视图会被标记为无效状态。当用
户访问视图时,Oracle 会自动重新编译视图。除此之外,用户也可以用ALTER VIEW 语句手动编译视
图,下面来看一个例子。
【例 10.27】通过手动方式重新编译视图emp_view_union,代码及运行结果如下。
SQL> alter view emp_view_union compile;
视图已变更
4.删除视图
当视图不再需要时,用户可以执行 DROP VIEW 语句删除视图。用户可以直接删除其自身模式中的视图,但如果要删除其他用户模式中的视图,要求该用户必须具有DROP ANY VIEW 系统权限。下面来看一个例子。
【案例】删除视图 emp_view_union,代码及运行结果如下。
SQL> drop view emp_view_union;
视图已删除
执行 DROP VIEW 语句后,视图的定义将被删除,这对视图内所有的数据没有任何影响,它们仍
然存储在基本表中。


阅读更多

没有更多推荐了,返回首页