zoukankan      html  css  js  c++  java
  • 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 ,刷新间隔
  • 相关阅读:
    hadoop
    常用安装
    rdd相关
    spark安装
    psutil
    scala linux终端高亮显示
    【原创】正则表达式(知识点总结)
    检测对象是否有某个属性(原型链检测和对象自身检测)
    JavaScript核心(对象+原型+函数+闭包+this+上下文堆栈+作用域链)
    JavaScript ES6迭代器指南
  • 原文地址:https://www.cnblogs.com/Remedy/p/8652224.html
Copyright © 2011-2022 走看看