♣
题目部分
Oracle中的视图分为哪几类?
♣
答案部分
Oracle的视图大约可以分为以下几类:
(1)简单视图,基于单个表所建视图,不包含任何函数、表达式及分组数据的视图。
(2)复杂视图,包含函数、表达式或者分组数据的视图。
(3)连接视图,基于多表所建立的视图。
(4)只读视图,只允许执行查询操作。
(5)内联视图(Inline View),也叫内嵌视图、临时视图、行内视图、或内建视图,它是出现在FROM子句中的子查询,内联视图不属于数据库对象。
(6)物化视图(Materialized Views),物化视图是包括一个查询结果的数据库对象,更多内容可以参考【真题138、物化视图(Materialized Views)的作用是什么?】。
在Oracle中,如果要在当前用户中创建视图,那么用户必须具有CREATE VIEW的系统权限。如果要在其他用户中创建视图,那么用户必须具有CREATE ANY VIEW的系统权限。
在Oracle中创建视图的语法如下所示:
CREATE [ OR REPLACE ] [ FORCE ] VIEW [SCHEMA.]VIEW_NAME
[ (COLUMN1,COLUMN2,...) ]
AS
SELECT ...
[ WITH CHECK OPTION ] [ CONSTRAINT CONSTRAINT_NAME ]
[ WITH READ ONLY ];
有关创建视图的语法,需要注意以下几点内容:
① OR REPLACE:如果存在同名的视图,那么使用新视图重建已有的视图。
② FORCE:强制创建视图,不考虑基表是否存在,也不考虑是否具有使用基表的权限。
③ COLUMN1,COLUMN2,...:视图的列名,列名的个数必须与SELECT查询中列的个数相同。如果SELECT查询包含函数或表达式,那么必须为其定义列名。此时,既可以用COLUMN1,COLUMN2指定列名,也可以在SELECT查询中指定列名。
④ WITH CHECK OPTION:指定对视图执行的DML操作必须满足“视图子查询”的条件,即对通过视图进行的增、删、改操作进行检查,要求增、删、改操作的数据必须是SELECT所能查询到的数据,否则不允许操作,并返回错误提示。在默认情况下,在增、删、改之前并不会检查这些行是否能被SELECT检索到。
⑤ WITH READ ONLY:创建的视图只能用于查询数据而不能用于更改数据。
创建简单视图的示例如下所示:
SQL> CREATE
VIEW
VW_EMP_LHR AS
SELECT
* FROM
SCOTT.EMP WHERE
DEPTNO =20;
View
created.
SQL> SELECT
* FROM
VW_EMP_LHR WHERE
ROWNUM<=4;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7566 JONES MANAGER 7839 02-APR-81 2975 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
视图依赖于基础表的存在而存在,当基础表的结构被改变后,视图的结构也可能会受影响。在这种情况下,要使用视图就需要重新编译;但一般在进行查询时,视图会自动重新编译,所以,手动编译其实并不常用。手动编译视图的命令如下所示:
ALTER VIEW 视图名 COMPILE;
使用DBA_TAB_COLUMNS视图可以查询到所有的表、视图和簇表的列的详细内容,但是这个视图不包括系统产生的隐藏列和不可见列,而视图DBA_TAB_COLS可以查询到系统产生的隐藏列和不可见列。另外,视图DBA_UPDATABLE_COLUMNS可以查询到所有连接视图中的列是否可以被更新。通过如下的SQL语句可以查询到视图的所有列的详细情况:
SELECT
DV.OWNER,
DV.VIEW_NAME,
DL.COLUMN_NAME,
DL.DATA_TYPE,
DL.NULLABLE,
DL.COLUMN_ID,
DL.VIRTUAL_COLUMN,
DL.HIDDEN_COLUMN,
DU.DELETABLE,
DU.UPDATABLE,
DU.INSERTABLE
FROM
DBA_VIEWS DV, DBA_TAB_COLS DL, DBA_UPDATABLE_COLUMNS DU
WHERE
DV.VIEW_NAME = DL.TABLE_NAME
AND
DV.VIEW_NAME = DU.TABLE_NAME
AND
DL.COLUMN_NAME = DU.COLUMN_NAME
AND
DV.OWNER = DL.OWNER
AND
DV.OWNER = DU.OWNER
ORDER
BY
DL.COLUMN_ID;
本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。