oracle转制视图,Oracle视图[转]

视图的概念

视图是基于一张表或多张表或另外一个视图的逻辑表。视图不同于表,视图本身不包含任何数据。表是实际独立存在的实体,是用于存储数据的基本结构。而视图只是一种定义,对应一个查询语句。视图的数据都来自于某些表,这些表被称为基表。通过视图来查看表,就像是从不同的角度来观察一个(或多个)表。

视图有如下一些优点:

* 可以提高数据访问的安全性,通过视图往往只可以访问数据库中表的特定部分,限制了用户访问表的全部行和列。

* 简化了对数据的查询,隐藏了查询的复杂性。视图的数据来自一个复杂的查询,用户对视图的检索却很简单。

* 一个视图可以检索多张表的数据,因此用户通过访问一个视图,可完成对多个表的访问。

* 视图是相同数据的不同表示,通过为不同的用户创建同一个表的不同视图,使用户可分别访问同一个表的不同部分。

视图可以在表能够使用的任何地方使用,但在对视图的操作上同表相比有些限制,特别是插入和修改操作。对视图的操作将传递到基表,所以在表上定义的约束条件和触发器在视图上将同样起作用。

视图的创建

创建视图需要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;

ENAME

10

20

30

40

ADAMS

CLERK

ALLEN

SALESMAN

BLAKE

MANAGER

CLARK

MANAGER

FORD

ANALYST

JAMES

CLERK

JONES

MANAGER

KING

PRESIDENT

MARTIN

SALESMAN

MILLER

CLERK

SCOTT

ANALYST

SMITH

CLERK

TURNER

SALESMAN

WARD

SALESMAN

YA_PING

ANALYST

CEO

杨平

CEO

2.创建只读视图

创建只读视图要用WITH READ ONLY选项。

CREATEORREPLACEVIEWvi_manager

ASSELECT*FROMempWHEREjob='MANAGER'

WITHREADONLY;

执行

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

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7782

CLARK

MANAGER

7839

1981-06-09

2450.00

10

7839

KING

PRESIDENT

1981-11-17

5000.00

10

7934

MILLER

CLERK

7782

1982-01-23

1300.00

10

8888

liping

CEO

7782

1983-04-28

5000.00

0.00

10

视图中插入其他部门的员工,结果会怎么样呢?结果是允许插入.但是在视图中看不见,在基表中可以看见,这显然是不合理的。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
视图:是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表,Oracle的数据库对象分为五种:表,视图,序列,索引和同义词。 视图是存储在数据字典里的一条select语句。通过创建视图可以提取数据的逻辑上的集合或组合。 视图的优点: 1.对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。 2.用户通过简单的查询可以从复杂查询中得到结果。 3.维护数据的独立性,试图可从多个表检索数据。 4.对于相同的数据可产生不同的视图视图分为简单视图和复杂视图: 1、简单视图只从单表里获取数据,复杂视图从多表; 2、简单视图不包含函数和数据组,复杂视图包含; 3、简单视图可以实现DML操作,复杂视图不可以。 语法结构:创建视图 CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[, alias]...)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY] 语法解析: OR REPLACE :若所创建的试图已经存在,则替换旧视图; FORCE:不管基表是否存在ORACLE都会自动创建该视图(即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用); NOFORCE :如果基表不存在,无法创建视图,该项是默认选项(只有基表都存在ORACLE才会创建该视图)。 alias:为视图产生的列定义的别名; subquery :一条完整的SELECT语句,可以在该语句中定义别名; WITH CHECK OPTION :插入或修改的数据行必须满足视图定义的约束; WITH READ ONLY :默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),WITH READ ONLY说明视图是只读视图,不能通过该视图进行增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。 案例3:基于EMP表和DEPT表创建视图 代码演示:视图 SQL> CREATE OR REPLACE VIEW EMPDETAIL 2 AS 3 SELECT EMPNO,ENAME,JOB,HIREDATE,EMP.DEPTNO,DNAME 4 FROM EMP JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO 5 WITH READ ONLY 6 / VIEW CREATED SQL> SELECT * FROM EMPDETAIL; ① EMPNO ENAME JOB HIREDATE DEPTNO DNAME 7369 SMITH CLERK 17-12月-80 20 RESEARCH 7499 ALLEN SALESMAN 20-2月 -81 30 SALES 7521 WARD SALESMAN 22-2月 -81 30 SALES 7566 JONES MANAGER 02-4月 -81 20 RESEARCH 7654 MARTIN SALESMAN 28-9月 -81 30 SALES 7698 BLAKE MANAGER 01-5月 -81 30 SALES 7782 CLARK MANAGER 09-6月 -81 10 ACCOUNTING 7788 SCOTT ANALYST 19-4月 -87 20 RESEARCH 7839 KING PRESIDENT 17-11月-81 10 ACCOUNTING 7844 TURNER SALESMAN 08-9月 -81 30 SALES 7876 ADAMS CLERK 23-5月 -87 20 RESEARCH 7900 JAMES CLERK 03-12月-81 30 SALES 7902 FORD ANALYST 03-12月-81 20 RESEARCH 7934

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值