這幾天每天被該死的報表折騰死了,簡直就是折磨。自己剛接手這塊業務時間不長,發現以前的人挖的坑,在報表這裡就各種體現,為了一個簡單的報表,要填各種各樣的坑。先來說一下我們這裡做報表的方法吧。
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,此時就會連參照完整性約束會被一起刪除掉。
總結
以後的工作中,至少知道了視圖這麼個東西,在腦子裡有視圖這個概念,能夠知道視圖是個什麼東西就好了,不要輕易的被別人鄙視,特別是做技術的。你懂的~~~