Oracle视图[转]

来源:互联网 发布:伪装者 程锦云 知乎 编辑:程序博客网 时间:2024/04/29 23:57

视图的概念
  视图是基于一张表或多张表或另外一个视图的逻辑表。视图不同于表,视图本身不包含任何数据。表是实际独立存在的实体,是用于存储数据的基本结构。而视图只是一种定义,对应一个查询语句。视图的数据都来自于某些表,这些表被称为基表。通过视图来查看表,就像是从不同的角度来观察一个(或多个)表。
视图有如下一些优点:
* 可以提高数据访问的安全性,通过视图往往只可以访问数据库中表的特定部分,限制了用户访问表的全部行和列。
* 简化了对数据的查询,隐藏了查询的复杂性。视图的数据来自一个复杂的查询,用户对视图的检索却很简单。
* 一个视图可以检索多张表的数据,因此用户通过访问一个视图,可完成对多个表的访问。
* 视图是相同数据的不同表示,通过为不同的用户创建同一个表的不同视图,使用户可分别访问同一个表的不同部分。
视图可以在表能够使用的任何地方使用,但在对视图的操作上同表相比有些限制,特别是插入和修改操作。对视图的操作将传递到基表,所以在表上定义的约束条件和触发器在视图上将同样起作用。

视图的创建
创建视图需要CREAE VIEW系统权限,视图的创建语法如下:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW 视图名[(别名1[,别名2...])]
AS 子查询
[WITH CHECK OPTION [CONSTRAINT 约束名]]
[WITH READ ONLY]
其中:
OR REPLACE 表示替代已经存在的视图。
FORCE表示不管基表是否存在,创建视图。
NOFORCE表示只有基表存在时,才创建视图,是默认值。
别名是为子查询中选中的列新定义的名字,替代查询表中原有的列名。
子查询是一个用于定义视图的SELECT查询语句,可以包含连接、分组及子查询。
WITH CHECK OPTION表示进行视图插入或修改时必须满足子查询的约束条件。后面的约束名是该约束条件的名字。
WITH READ ONLY 表示视图是只读的。
删除视图的语法如下:
DROP VIEW 视图名;
删除视图者需要是视图的建立者或者拥有DROP ANY VIEW权限。视图的删除不影响基表,不会丢失数据。
1.创建简单视图 (一个行转列)
create or replace view v_iews as
select ename
  ,max(decode(deptno,'10',job))"10"
  ,max(decode(deptno,'20',job))"20"
  ,max(decode(deptno,'30',job))"30"
  ,max(decode(deptno,'40',job))"40" from emp group by ename

执行结果:

select * from v_iews;

ENAME10203040ADAMSCLERKALLENSALESMANBLAKEMANAGERCLARKMANAGERFORD ANALYSTJAMESCLERKJONESMANAGERKINGPRESIDENTMARTINSALESMANMILLERCLERK  SCOTTANALYSTSMITHCLERKTURNERSALESMANWARDSALESMANYA_PINGANALYSTCEO杨平CEO

 

2.创建只读视图
创建只读视图要用WITH READ ONLY选项。 
  1. CREATE OR REPLACE VIEW vi_manager    
  2.         AS SELECT * FROM emp WHERE job= 'MANAGER'  
  3.         WITH READ ONLY;  

执行

DELETE FROM vi_manager;  

 

SQL> delete from vi_manager;

delete from vi_manager

ORA-01752: 不能从没有一个键值保存表的视图中删除

 

3.创建基表不存在的视图
正常情况下,不能创建错误的视图,特别是当基表还不存在时。但使用FORCE选项就可以在创建基表前先创建视图。创建的视图是无效视图,当访问无效视图时,Oracle将重新编译无效的视图。
使用FORCE选项创建带有错误的视图:

 

4.视图的操作
对视图经常进行的操作是查询操作,但也可以在一定条件下对视图进行插入、删除和修改操作。对视图的这些操作最终传递到基表。但是对视图的操作有很多限定。如果视图设置了只读,则对视图只能进行查询,不能进行修改操作。
1.视图的插入 
步骤2:创建视图:
CREATE OR REPLACE VIEW vi_dept10   
        AS SELECT * FROM emp WHERE deptno= 10;
步骤2:插入新员工:
insert into vi_dept10 values (8888,'liping','CEO',7782,to_date('1983-04-28','yyyy-mm-dd'),5000,0,10);
步骤3:查询实体表
select * from emp where deptno=10;
EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO7782  CLARKMANAGER78391981-06-092450.00107839 KINGPRESIDENT1981-11-175000.00107934  MILLERCLERK  77821982-01-231300.00108888 lipingCEO77821983-04-285000.000.0010
视图中插入其他部门的员工,结果会怎么样呢?结果是允许插入.但是在视图中看不见,在基表中可以看见,这显然是不合理的。
2.使用WITH CHECK OPTION选项
如果设置了WITH CHECK OPTION选项,那么只有部门编号为20的员工才能通过视图进行插入。
使用WITH CHECK OPTION选项限制视图的插入。
步骤1:新建部门20视图,带WITH CHECK OPTION选项:
 CREATE OR REPLACE VIEW vi_dept20   
        AS SELECT * FROM emp WHERE deptno= 20
        with check option;
步骤2:插入新员工:
SQL> insert into vi_dept20 values (8889,'ping','CEO',7782,to_date('1983-04-28','yyyy-mm-dd'),5000,0,10);
insert into vi_dept20 values (8889,'ping','CEO',7782,to_date('1983-04-28','yyyy-mm-dd'),5000,0,10)
ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句
3.来自基表的限制
除了以上的限制,基表本身的限制和约束也必须要考虑。

5.视图的查看
USER_VIEWS字典中包含了视图的定义。
USER_UPDATABLE_COLUMNS字典包含了哪些列可以更新、插入、删除。
USER_OBJECTS字典中包含了用户的对象。
可以通过DESCRIBE命令查看字典的其他列信息。在这里给出一个训练例子。

 

SQL> SELECT TEXT FROM USER_VIEWS WHERE VIEW_NAME='VI_DEPT10';

TEXT
--------------------------------------------------------------------------------
SELECT "EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO" FROM emp WHERE

 

原创粉丝点击