Loading

Oracle视图

视图的应用场合
1.简化用户对数据的理解,隐藏表结构的复杂性。经常使用的查询定义为视图,不用每次操作指定全部的条件
2.限制对一组预定义的表行的或列的访问,提供更好的安全级别
3.隔离应用程序对基表定义的更改,并不会影响到视图

视图分为简单视图和复杂视图:

1、简单视图只从单表里获取数据,复杂视图从多表;

2、简单视图不包含函数和数据组,复杂视图包含;

3、简单视图可以实现DML操作,复杂视图部分可以。

复杂视图DML限制条件

1〉不允许违反约束的 DML 操作。
2〉不能将一个值添加到包含算术表达式的列中,列不能是虚拟列
3〉在非 key-preserved 表上不允许 DML 操作。(key-preserve table)键保留表是理解连接视图修改限制的一个基本概念。该表的主键列全部显示在视图中,并且它们的值在视图中都是唯一且非空的。也就是说,表的键值在一个连接视图中也是键值,那么就称这个表为键保留表。
4〉在包含组函数、GROUP BY 子句、ROWNUM伪列或DISTINCT关键字的视图上不允许 DML 操作。
 1 --赋予用户创建视图的权限
 2 grant create view to scott;
 3 --创建复杂视图
 4 create or replace view v_emp_sum (deptno,emp_count,max_sal,min_sal,sum_sal)
 5 as select dept.dname,count(emp.empno),max(emp.sal),min(emp.sal),sum(emp.sal)
 6 from emp,dept where emp.deptno =dept.deptno group by dept.dname; 
 7 select * from v_emp_sum;
 8 --可进行DML(insert,update,delete)操作的视图
 9 create or replace view v_empdept_update
10      as 
11        select emp.empno,emp.ename,emp.job,dept.dname,dept.loc from dept,emp
12        where dept.deptno=emp.deptno;
13        
14  update v_empdept_update set ename='张三丰'   where empno=7499;
15   select * from v_empdept_update;
16  
17 简单视图是可以进行DML操作。复杂视图有部分可以DML操作,若复杂视图中有分组函数、groupby字句、distinct、伪列等则不可以做DML操作。
18  --数据视图字典查看哪些列时可以更新的 
19  select table_name,column_name,updatable, insertable,deletable from user_updatable_columns
20  where table_name='V_EMPDEPT_UPDATE';
21 /*内嵌视图查询,内嵌视图是子查询中的一种,可以与数据表,视图一样作为数据源的存在
22 但是它只会使用一次,不会创建具体的方案对象,  不具备复用性*/
23 select d.deptno,d.dname,emp_cnt.tot  from dept d,(select deptno,count(*) tot  from emp group by deptno)  emp_cnt where d.deptno=emp_cnt.deptno; 
24 --对象视图
25 create or replace type typ_emp as object(
26        empno number,
27        empname varchar2(20),
28        job varchar2(20)
29 )
30 --让scott表中的数据使用面向对象的方式编程,创建一个基于emp表的对象视图
31 create or replace view  ov_emp  of typ_emp  with object oid(empno)
32 as select empno a_id,ename,job  from emp;
33 ---对象类型的使用实例
34 Declare
35     o_emp typ_emp;
36  begin
37    select value(t)            --从对象视图中获得对象实例
38    into o_emp 
39    from ov_emp t
40    where empno=7369;
41    o_emp.empname:='张三丰';
42    o_emp.job:='武当掌门';
43    o_emp.empno:=7999;
44    insert into ov_emp values(o_emp);         --向对象视图中插入一个新的对象实例
45 end;
46 select * from emp;
47  
48 --修改视图的定义信息
49 create or replace  view emp_view_union as
50 select d.dname,d.loc,e.empno,e.ename
51 from emp e,dept d
52 where e.deptno = d.deptno and d.deptno =30;
53 select  * from emp_view_union;
54 --重新编译视图,当用户访问视图时,Oracle会自动重新编译视图
55 --除此之外,也可以用alter view语句手动编译视图
56 alter view emp_view_union compile;
57 --删除视图
58 drop view emp_view_union;
59 --内联视图  emp_cnt
60 select d.deptno,d.dname,emp_cnt.tot  from dept d,(select deptno, count(*) tot 
61 from emp group by deptno) emp_cnt where d.deptno =emp_cnt.deptno;
62 --创建薪资等级内联视图
63  select dept.deptno,dept.dname,NVL(MAX(emp_grade.grade),0) from dept,
64  (select emp.ename,emp.job,emp.deptno,(select grade from SALGRADE where emp.sal between
65   salgrade.losal and salgrade.hisal) grade from emp ) emp_grade          --创建一个内联视图
66   where dept.deptno =emp_grade.deptno(+)           --使用左链接显示所有部门
67   group by dept.deptno,dept.dname
68   order by nvl(max(emp_grade.grade),0) desc;
69  
70  
71  --指定在视图中只有可访问的行才能被插入或修改
72 create or replace view v_deptemp_check
73 as select empno,ename,job,comm,deptno
74  from emp where deptno=20
75  with check option constraint v_empdept_chk;
76 --如果操作的数据不在select查询所能选择的数据范围将报错
77 insert into v_deptemp_check values(7999,'李思','经理',7369,sysdate,
78 800,null,30);
79 
80 --只读视图 DQL-SELECT
81 create or replace view emp_view_readonly as 
82 select * from dept where deptno !=88 
83 with read only
84 update emp_view_readonly set loc='沈阳';
85 create or replace view emp_view_complex as 
86 select deptno 部门编号,max(sal) 最高工资,min(sal) 最低工资,avg(sal) 平均工资
87 from emp group by deptno;
88 select * from emp_view_complex;
89 
90 --重新编译视图,当用户访问视图时,Oracle会自动重新编译视图
91 --除此之外,也可以用alter view语句手动编译视图
92 alter view emp_view_union compile;
93  当用户需要临时性地聚合一些数据集,构造这些数据集的查询语句,不需要重复使用时,可以考虑内联视图
94   如果数据结果需要重复使用,考虑建立临时表并且添加索引来争强查询性能;

 1 创建语句:create materialized view mv_name as select * from table_name    默认情况下,如果没指定刷新方法和刷新模式,则Oracle默认为FORCE和DEMAND。
 2 物化视图
 3 对于标准视图来说,用户每次引用视图都必须重新执行视图的解析过程
 4 如果定义的视图非常复杂,非常消耗时间,对于频繁访问视图效率非常低
 5 物化视图用来解决这种复杂视图的性能问题
 6 1. 实现两个数据库之间的数据同步,可以存在时间差。
 7 2. 如果是远程链接数据库的场景时,提高查询速度。
 8 不能改变物化表的列和数据,只能改基表;
 9 
10 --刷新指基表的数据发生变化时,如何更新物化视图中的数据
11 --必须先建立物化视图表 ,用于记录基表数据更改的模式对象,指定在物化视图日志中记录更改主键
12 create materialized view log on emp with primary key
13 including  new values;
14 --赋予权限
15  grant create materialized view to scott;
16 --默认情况下,如果没指定刷新方法和刷新模式,则Oracle默认为FORCE和DEMAND。
17   create materialized view ma_emp_count as 
18   select deptno,count(*) deptnum  from emp group by deptno;
19  exec dbms_mview.refresh('MA_EMP_COUNT');
20 
21 --refresh fast  指定刷新方式
22   create materialized view emp_data refresh fast as select * from emp;
23   insert into emp values(8099,'张大白','分析员',7369,sysdate,2000,100,20);
24 --查看日志表 
25  select * from MLOG$_emp;
26   select * from emp_data;
27  --视图使用的是on demand的更新模式,需要手动刷新物化视图
28  --在空闲的时候手动更改,避开高峰期
29  exec dbms_mview.refresh('EMP_DATA','F');
30  
31  --修改物化视图
32  alter materialized view emp_data
33 on demand
34  refresh with primary key --更改物化视图的结构为主键物化视图
35  start with trunc(sysdate+1)+9/24 --开始时间是明天9点
36  next  sysdate+2
37  enable query rewrite;   --启用物化视图的查询重写项
38   
39  --删除实体化视图
40  drop materialized view emp_data;
41  --删除实体化视图日志
42  drop materialized view log on emp;
43   
44  一.refresh[FAST]  complete[force]选项指定视图刷新的方式
45  1.Fast 增量刷新: 假设第一次刷新时间为T1,Fast模式刷新时,只添加T1到当前时间段
46  基表变化的数据,需要物化视图日志表
47  
48  2. complete 全部刷新,相当于重新执行一次创建视图的查询语句
49  3 .Force: 默认模式,当可以使用Fast模式时采用Fast,否则complete
50  
51on[commit][demand]指定数据刷新的时间
52  on demand 用户需要的时候,手动刷新 默认
53  on commit 当有数据提交的时候立即刷新
54  三 物化视图的创建方式
55  BUILD immediate,在创建视图的时候就生成数据(默认)
56  build deferred  创建不生成,根据需要来生成
57  
58  四 启用或禁用查询重写
59  enable query rewrite 将对基表的查询转化为物化视图查询,提高查询性能
60  disable query rewrite 禁用查询重写.
61 62   start with 指定的时间开始,
63   next ,刷新间隔

 

posted @ 2018-03-26 17:16  火柴天堂  阅读(306)  评论(0编辑  收藏  举报