視圖是表的另外一種表示形式,他通過(guò)使用SELECT語(yǔ)句定義一個(gè)顯示數(shù)據(jù)的虛表,這個(gè)虛表只有對(duì)視圖的定義,并不包含實(shí)際的數(shù)據(jù)。
視圖簡(jiǎn)介
可以將視圖看成是一個(gè)“虛表”,或是一個(gè)“存儲(chǔ)的查詢”。在創(chuàng)建時(shí)視圖時(shí),只是將視圖的定義信息保存到數(shù)據(jù)字典中,并不將實(shí)際的數(shù)據(jù)復(fù)制到任何地方。
如:
CREATE OR REPLACE VIEW view_dept_emp
AS
SELECT emp.empno, emp.ename, emp.job, emp.mgr, emp.hiredate, dept.dname,
dept.loc
FROM emp, dept
WHERE emp.deptno = dept.deptno;
查詢視圖就像查詢普通的表一樣,如:
SELECT * FROM view_dept_emp;
視圖有如下優(yōu)點(diǎn):
- 視圖限制數(shù)據(jù)的訪問(wèn),因?yàn)橐晥D能夠選擇性地顯示表中的列。
- 視圖可以用來(lái)構(gòu)成簡(jiǎn)單的查詢以取回復(fù)雜查詢的結(jié)果。例如,視圖能用于從多表中查詢信息,而用戶不必知道怎么寫(xiě)連接語(yǔ)句。
- 視圖對(duì)特別的用戶和應(yīng)用程序提供數(shù)據(jù)獨(dú)立性,一個(gè)視圖可以從幾個(gè)表中取回?cái)?shù)據(jù)。
- 視圖提供用戶組,按照他們的特殊標(biāo)準(zhǔn)訪問(wèn)數(shù)據(jù)。
創(chuàng)建視圖
視圖按照是否涉及DML操作,可以分為兩類(lèi):
- 簡(jiǎn)單視圖:視圖的數(shù)據(jù)僅來(lái)自一個(gè)表,在視圖的SELECT語(yǔ)句中不包含函數(shù)或數(shù)據(jù)分組,總是可以通過(guò)視圖來(lái)執(zhí)行DML操作。
- 復(fù)雜視圖:視圖的數(shù)據(jù)來(lái)自多個(gè)表,可以包含函數(shù)或數(shù)據(jù)分組,并不總是可以通過(guò)視圖進(jìn)行DML操作。
簡(jiǎn)單視圖
如:
CREATE OR REPLACE VIEW v_deptemp
AS
SELECT empno, ename, job, mgr, hiredate, sal, comm
FROM emp
WHERE deptno = 20;
可以像使用表一樣來(lái)使用這個(gè)視圖,如:
SELECT * FROM v_deptemp;
INSERT INTO v_deptemp VALUES(7999,'李思','經(jīng)理',7369,SYSDATE,8000,NULL);
可以使用WITH CHECK OPTION選項(xiàng)限制操作的數(shù)據(jù)必須是SELECT查詢所能選擇出來(lái)的數(shù)據(jù),如:
CREATE OR REPLACE VIEW v_deptemp_check
AS
SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno
FROM emp
WHERE deptno = 20
WITH CHECK OPTION CONSTRAINT v_empdept_chk;
當(dāng)執(zhí)行SML語(yǔ)句時(shí),如果操作的數(shù)據(jù)不在SELECT查詢所能選擇的數(shù)據(jù)范圍內(nèi),那么將觸發(fā)ORA-01402異常。
如果要禁止在視圖上執(zhí)行DML操作,可以使用WITH READ ONLY選項(xiàng),如:
CREATE OR REPLACE VIEW v_deptemp_readonly
AS
SELECT empno, ename, job, mgr, hiredate, sal, comm
FROM emp
WHERE deptno = 20
WITH READ ONLY;
如果在該視圖上進(jìn)行DML操作,將會(huì)觸發(fā)ORA-42399異常。
可以通過(guò)給視圖指定別名來(lái)提供更加友好的視圖名稱,如:
CREATE OR REPLACE VIEW v_deptemp_alias (員工編號(hào),
員工名稱,
職位,
經(jīng)理,
雇傭日期,
薪水,
備注
)
AS
SELECT empno, ename, job, mgr, hiredate, sal, comm
FROM emp
WHERE deptno = 20;
被列出的列名的個(gè)數(shù)必須與在子查詢中被選擇的表達(dá)式相匹配。
復(fù)雜視圖
如:
CREATE OR REPLACE VIEW v_sumdept(部門(mén)名稱,部門(mén)編號(hào))
AS
SELECT dept.dname, SUM (emp.sal) sumsal
FROM emp, dept
WHERE emp.deptno = dept.deptno(+)
GROUP BY dept.dname;
修改視圖
使用CREATE OR REPLACE即可刪除原來(lái)的視圖,然后創(chuàng)建一個(gè)新的視圖取代原有的視圖,同時(shí)會(huì)保留在該視圖上授予的各種權(quán)限。
更改視圖后,依賴于該視圖的所有視圖及PL/SQL程序都會(huì)變成INVALID狀態(tài)。
更新視圖的基礎(chǔ)表后,視圖會(huì)失效,可以對(duì)視圖進(jìn)行重編譯使視圖有效。Oracle會(huì)在視圖被訪問(wèn)時(shí)自動(dòng)重新編譯這些視圖。
也可以通過(guò)ALTER VIEW語(yǔ)句顯式地重新編譯視圖,如:
ALTER VIEW v_deptemp COMPILE;
可以通過(guò)查詢數(shù)據(jù)字典視圖user_objects 來(lái)獲取視圖的詳細(xì)信息,如:
SELECT last_ddl_time, object_name, status
FROM user_objects
WHERE object_name = 'V_DEPTEMP';
刪除視圖
如:
DROP VIEW view_emp_dept;
當(dāng)視圖被刪除之后,視圖的定義會(huì)從數(shù)據(jù)字典中刪除,在視圖上授予的權(quán)限也被刪除,其他引用該視圖的視圖及存儲(chǔ)過(guò)程等都會(huì)失效。
|