【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程式設計師面試筆試寶典》,作者:李華榮。