视图是表的另外一种表示形式,他通过使用SELECT语句定义一个显示数据的虚表,这个虚表只有对视图的定义,并不包含实际的数据。
视图简介
可以将视图看成是一个“虚表”,或是一个“存储的查询”。在创建时视图时,只是将视图的定义信息保存到数据字典中,并不将实际的数据复制到任何地方。
如:
CREATE OR REPLACE VIEW view_dept_emp
AS
SELECT emp.empno, emp.ename, emp.job, emp.mgr, emp.hiredate, dept.dname,
dept.loc
FROM emp, dept
WHERE emp.deptno = dept.deptno;
查询视图就像查询普通的表一样,如:
SELECT * FROM view_dept_emp;
视图有如下优点:
- 视图限制数据的访问,因为视图能够选择性地显示表中的列。
- 视图可以用来构成简单的查询以取回复杂查询的结果。例如,视图能用于从多表中查询信息,而用户不必知道怎么写连接语句。
- 视图对特别的用户和应用程序提供数据独立性,一个视图可以从几个表中取回数据。
- 视图提供用户组,按照他们的特殊标准访问数据。
创建视图
视图按照是否涉及DML操作,可以分为两类:
- 简单视图:视图的数据仅来自一个表,在视图的SELECT语句中不包含函数或数据分组,总是可以通过视图来执行DML操作。
- 复杂视图:视图的数据来自多个表,可以包含函数或数据分组,并不总是可以通过视图进行DML操作。
简单视图
如:
CREATE OR REPLACE VIEW v_deptemp
AS
SELECT empno, ename, job, mgr, hiredate, sal, comm
FROM emp
WHERE deptno = 20;
可以像使用表一样来使用这个视图,如:
SELECT * FROM v_deptemp;
INSERT INTO v_deptemp VALUES(7999,'李思','经理',7369,SYSDATE,8000,NULL);
可以使用WITH CHECK OPTION选项限制操作的数据必须是SELECT查询所能选择出来的数据,如:
CREATE OR REPLACE VIEW v_deptemp_check
AS
SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno
FROM emp
WHERE deptno = 20
WITH CHECK OPTION CONSTRAINT v_empdept_chk;
当执行SML语句时,如果操作的数据不在SELECT查询所能选择的数据范围内,那么将触发ORA-01402异常。
如果要禁止在视图上执行DML操作,可以使用WITH READ ONLY选项,如:
CREATE OR REPLACE VIEW v_deptemp_readonly
AS
SELECT empno, ename, job, mgr, hiredate, sal, comm
FROM emp
WHERE deptno = 20
WITH READ ONLY;
如果在该视图上进行DML操作,将会触发ORA-42399异常。
可以通过给视图指定别名来提供更加友好的视图名称,如:
CREATE OR REPLACE VIEW v_deptemp_alias (员工编号,
员工名称,
职位,
经理,
雇佣日期,
薪水,
备注
)
AS
SELECT empno, ename, job, mgr, hiredate, sal, comm
FROM emp
WHERE deptno = 20;
被列出的列名的个数必须与在子查询中被选择的表达式相匹配。
复杂视图
如:
CREATE OR REPLACE VIEW v_sumdept(部门名称,部门编号)
AS
SELECT dept.dname, SUM (emp.sal) sumsal
FROM emp, dept
WHERE emp.deptno = dept.deptno(+)
GROUP BY dept.dname;
修改视图
使用CREATE OR REPLACE即可删除原来的视图,然后创建一个新的视图取代原有的视图,同时会保留在该视图上授予的各种权限。
更改视图后,依赖于该视图的所有视图及PL/SQL程序都会变成INVALID状态。
更新视图的基础表后,视图会失效,可以对视图进行重编译使视图有效。Oracle会在视图被访问时自动重新编译这些视图。
也可以通过ALTER VIEW语句显式地重新编译视图,如:
ALTER VIEW v_deptemp COMPILE;
可以通过查询数据字典视图user_objects
来获取视图的详细信息,如:
SELECT last_ddl_time, object_name, status
FROM user_objects
WHERE object_name = 'V_DEPTEMP';
删除视图
如:
DROP VIEW view_emp_dept;
当视图被删除之后,视图的定义会从数据字典中删除,在视图上授予的权限也被删除,其他引用该视图的视图及存储过程等都会失效。