IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Oracle学习笔记——视图

    果冻想发表于 2015-07-15 14:24:26
    love 0

    该死的报表

    这几天每天被该死的报表折腾死了,简直就是折磨。自己刚接手这块业务时间不长,发现以前的人挖的坑,在报表这里就各种体现,为了一个简单的报表,要填各种各样的坑。先来说一下我们这里做报表的方法吧。

    1. 在各种业务流程中,会记录各种日志,不同的日志记录到数据库不同的表中;
    2. 然后从不同的表中,取得关联的各种数据,以报表的形式展现数来;
    3. 从不同的关联表中取得的数据可以插入一个新的表中,也可以组成一个视图;
    4. 最后报表工具从这个新的表,或者视图中取的最终的数据(给各个老板看的数据)。

    可以看到,如果哪个日志表中记录的数据不对,或者哪个日志表中缺少了需要的数据,这就坑爹了,那这个报表还让人怎么做。而我需要完成的任务就是写存储过程,将各种表中的数据取出来,放到一个新的表中,或者组成一个视图。

    视图?对于Oracle中的视图,我感到好陌生,于是写下这篇文章,对Oracle中的视图进行简单的总结。

    啥是视图?

    视图是表中数据的逻辑表示。视图本身并不存储任何数据(这就是视图和表最直接的差别),而真正的数据是存在于基表中的。视图也和表一样,也带有名称的列和行。简单的说,视图就是一个展示的窗口,它可以从这个表拿点数据,从另一个表拿点数据,进行展示。这样一来,就不用建立一个新的表,就节省了空间。

    创建视图

    创建视图的语句就那么几个关键字,比较简单,下面就通过我工作中的一个例子进行说明。

    从营销计划表中取得所有的状态为1的数据,组成一个名为v_valid_plans的视图。SQL语句如下:

    CREATE VIEW v_valid_plans AS
    SELECT * 
    FROM ivr_marketing_plan
    WHERE status=1;
    

    CREATE VIEW是创建视图的关键字,后面跟的是视图的名字,对于视图,我一般都是以v_开头的形式命名;AS之后指定的是查询语句,表示从基表中获得需要的数据。这个查询语句可以是单表查询,也可以是多表查询,甚至可以从其它视图中获取数据,这样就出现了在视图上再创建视图的情况。

    在很多时候,对于视图,我们就是把它当做一个数据展示的窗口,并不想对视图直接进行操作,所以,一般我们都是建立一个只读的视图。例如:

    CREATE VIEW v_valid_plans AS
    SELECT * 
    FROM ivr_marketing_plan
    WHERE status=1
    WITH READ ONLY;
    

    加上WITH READ ONLY选项,就表示创建的视图是只读的。

    使用视图

    一般情况下,也就是大多数情况下,我们建立的视图都是只读的,就是为了查询数据,通过视图,我们就可以访问基表中的数据了。就像对基表查询那样。例如:

    SELECT * FROM v_valid_plans;
    

    这就是查询v_valid_plans视图中展示的所有数据。

    看看创建视图的原始语句

    对于我来说,见到一个对象,比如:表、视图、存储过程等,我都想去看看它的定义是什么样子的。不知道你们是不是这样的?探索欲望太强烈的,不去搞清楚它的定义,我用的都不放心。那么如何使用SQL命令查看视图的定义呢?

    使用以下语句就能得到指定用户,指定视图的定义:

    SET SERVEROUTPUT ON;
    SET LONG 100000;
    

    SET SERVEROUTPUT ON;即打开Oracle自带的输出方法DBMS_OUTPUT方法;SET LONG 100000;设置LONG类型缓冲区;而真正获得视图定义的是下面的语句:

    SELECT DBMS_METADATA.GET_DDL('VIEW', 'V_TB_STUDENT', 'JELLY') FROM DUAL;
    

    GET_DDL函数用来获取各种对象的定义,第一个参数表示获取视图的定义;第二个参数是指定的视图名;第三个参数指定的是用户名。

    视图名和用户名必须大写,否则就无法获得定义。

    调用完成以后,就会输出V_TB_STUDENT视图的定义:

    CREATE OR REPLACE FORCE VIEW "JELLY"."V_TB_STUDENT" ("ID", "NAME", "SEX", "AGE") AS select "ID","NAME","SEX","AGE" from jelly.tb_student with read only;

    删除视图

    如果觉的这个视图有点碍眼,有点多余,或者说看的不爽,没问题,直接干掉就好了。

    DROP VIEW V_TB_STUDENT;
    

    删除视图的时候,如果视图上存在参照完整性约束的引用,就无法删除视图,需要使用选项CASCADE CONSTRAINTS,此时就会连参照完整性约束会被一起删除掉。

    总结

    以后的工作中,至少知道了视图这么个东西,在脑子里有视图这个概念,能够知道视图是个什么东西就好了,不要轻易的被别人鄙视,特别是做技术的。你懂的~~~

    2015年5月28日 于呼和浩特。



沪ICP备19023445号-2号
友情链接