視圖是基於一個或多個資料表/視圖的邏輯表,本身不儲存資料,儲存於資料字典中的一條 SELECT 陳述式。基表是視圖查詢的來源物件。Oracle 五大資料庫物件:表、視圖、序列、索引、同義詞。
| 特性 | 簡易視圖 | 複雜視圖 |
|---|---|---|
| 資料來源 | 單一資料表 | 多張資料表 |
| 函數/群組 | 不包含 | 包含聚合函數、GROUP BY、DISTINCT |
| DML 操作 | 支援 | 不支援 |
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW view_name
[(alias [, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY];
關鍵字說明:
OR REPLACE:視圖存在時自動重建,保留授權FORCE:基表不存在也強制建立NOFORCE(預設):基表必須存在alias:為視圖欄位定義別名WITH CHECK OPTION:插入/修改資料必須符合視圖定義條件WITH READ ONLY:禁止任何 DML 操作CREATE OR REPLACE VIEW dept_sum_vw (name, minsal, maxsal, avgsal)
AS SELECT d.dname, MIN(e.sal), MAX(e.sal), AVG(e.sal)
FROM emp e, dept d
WHERE e.deptno = d.deptno
GROUP BY d.dname;
WITH CHECK OPTION 與 READ ONLY 時,不可使用 ORDER BYSYS_CnOR REPLACE 可在不刪除原視圖下修改定義並重新授權SELECT * FROM dept_sum_vw;SELECT view_name, text FROM user_views;(text 欄位為定義 SQL)DESC USER_VIEWS使用 CREATE OR REPLACE VIEW 重建同名視圖即可。
不可透過視圖修改基表的情況:
GROUP BY、DISTINCTROWNUM 偽欄位NOT NULL 且無預設值CREATE OR REPLACE VIEW vw_emp20
AS SELECT * FROM emp
WHERE deptno = 20
WITH CHECK OPTION CONSTRAINT vw_emp20_ck;
嘗試將 20 部門員工修改為其他部門會報錯:ORA-01402: view WITH CHECK OPTION where-clause violation,確保資料完整性。
DROP VIEW view_name;
僅移除視圖定義,不影響基表資料。基於被刪視圖的其他視圖/應用將失效。