【DB筆試面試516】Oracle中的視圖分為哪幾類?
- 2019 年 10 月 8 日
- 筆記
♣
題目部分
Oracle中的視圖分為哪幾類?
♣
答案部分
Oracle的視圖大約可以分為以下幾類:
(1)簡單視圖,基於單個表所建視圖,不包含任何函數、表達式及分組數據的視圖。
(2)複雜視圖,包含函數、表達式或者分組數據的視圖。
(3)連接視圖,基於多表所建立的視圖。
(4)只讀視圖,只允許執行查詢操作。
(5)內聯視圖(Inline View),也叫內嵌視圖、臨時視圖、行內視圖、或內建視圖,它是出現在FROM子句中的子查詢,內聯視圖不屬於資料庫對象。
(6)物化視圖(Materialized Views),物化視圖是包括一個查詢結果的資料庫對象,更多內容可以參考【真題138、物化視圖(Materialized Views)的作用是什麼?】。
在Oracle中,如果要在當前用戶中創建視圖,那麼用戶必須具有CREATE VIEW的系統許可權。如果要在其他用戶中創建視圖,那麼用戶必須具有CREATE ANY VIEW的系統許可權。
在Oracle中創建視圖的語法如下所示:
CREATE [ OR REPLACE ] [ FORCE ] VIEW [SCHEMA.]VIEW_NAME
[ (COLUMN1,COLUMN2,…) ]
AS
SELECT …
[ WITH CHECK OPTION ] [ CONSTRAINT CONSTRAINT_NAME ]
[ WITH READ ONLY ];
有關創建視圖的語法,需要注意以下幾點內容:
① OR REPLACE:如果存在同名的視圖,那麼使用新視圖重建已有的視圖。
② FORCE:強制創建視圖,不考慮基表是否存在,也不考慮是否具有使用基表的許可權。
③ COLUMN1,COLUMN2,…:視圖的列名,列名的個數必須與SELECT查詢中列的個數相同。如果SELECT查詢包含函數或表達式,那麼必須為其定義列名。此時,既可以用COLUMN1,COLUMN2指定列名,也可以在SELECT查詢中指定列名。
④ WITH CHECK OPTION:指定對視圖執行的DML操作必須滿足「視圖子查詢」的條件,即對通過視圖進行的增、刪、改操作進行檢查,要求增、刪、改操作的數據必須是SELECT所能查詢到的數據,否則不允許操作,並返回錯誤提示。在默認情況下,在增、刪、改之前並不會檢查這些行是否能被SELECT檢索到。
⑤ WITH READ ONLY:創建的視圖只能用於查詢數據而不能用於更改數據。
創建簡單視圖的示例如下所示:
SQL> CREATE
VIEW
VW_EMP_LHR AS
SELECT
* FROM
SCOTT.EMP WHERE
DEPTNO =20;
View
created.
SQL> SELECT
* FROM
VW_EMP_LHR WHERE
ROWNUM<=4;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7566 JONES MANAGER 7839 02-APR-81 2975 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
視圖依賴於基礎表的存在而存在,當基礎表的結構被改變後,視圖的結構也可能會受影響。在這種情況下,要使用視圖就需要重新編譯;但一般在進行查詢時,視圖會自動重新編譯,所以,手動編譯其實並不常用。手動編譯視圖的命令如下所示:
ALTER VIEW 視圖名 COMPILE;
使用DBA_TAB_COLUMNS視圖可以查詢到所有的表、視圖和簇表的列的詳細內容,但是這個視圖不包括系統產生的隱藏列和不可見列,而視圖DBA_TAB_COLS可以查詢到系統產生的隱藏列和不可見列。另外,視圖DBA_UPDATABLE_COLUMNS可以查詢到所有連接視圖中的列是否可以被更新。通過如下的SQL語句可以查詢到視圖的所有列的詳細情況:
SELECT
DV.OWNER,
DV.VIEW_NAME,
DL.COLUMN_NAME,
DL.DATA_TYPE,
DL.NULLABLE,
DL.COLUMN_ID,
DL.VIRTUAL_COLUMN,
DL.HIDDEN_COLUMN,
DU.DELETABLE,
DU.UPDATABLE,
DU.INSERTABLE
FROM
DBA_VIEWS DV, DBA_TAB_COLS DL, DBA_UPDATABLE_COLUMNS DU
WHERE
DV.VIEW_NAME = DL.TABLE_NAME
AND
DV.VIEW_NAME = DU.TABLE_NAME
AND
DL.COLUMN_NAME = DU.COLUMN_NAME
AND
DV.OWNER = DL.OWNER
AND
DV.OWNER = DU.OWNER
ORDER
BY
DL.COLUMN_ID;
本文選自《Oracle程式設計師面試筆試寶典》,作者:李華榮。