这几天每天被该死的报表折腾死了,简直就是折磨。自己刚接手这块业务时间不长,发现以前的人挖的坑,在报表这里就各种体现,为了一个简单的报表,要填各种各样的坑。先来说一下我们这里做报表的方法吧。
可以看到,如果哪个日志表中记录的数据不对,或者哪个日志表中缺少了需要的数据,这就坑爹了,那这个报表还让人怎么做。而我需要完成的任务就是写存储过程,将各种表中的数据取出来,放到一个新的表中,或者组成一个视图。
视图?对于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日 于呼和浩特。