首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle DUAL 虛擬表深度解析:用途、結構與常見操作

     編輯:Oracle 資料庫基礎

DUAL 是 Oracle 內建的單列單行虛擬表,專為「無需實體表即可執行 SELECT」而設計。本文解析其結構、存在意義與實戰用法。

DUAL 表結構

SQL> DESC dual
Name    Null?    Type
------  -------  -------------
DUMMY            VARCHAR2(1)
  • 只有一欄 DUMMY,型別 VARCHAR2(1),預設值 'X'。
  • 屬於 SYS 使用者,全體使用者可讀,不可刪除/修改結構。
  • 別稱「偽表」或「啞表」。

為什麼需要 DUAL?

Oracle SELECT 語法強制要求 FROM table。但 SYSDATE、USER、序列 NEXTVAL、純運算式等不依賴任何實體表,引入 DUAL 滿足語法規則。

常見用法速查表

場景SQL 範例說明
取得當前使用者SELECT USER FROM dual;
取得當前日期時間SELECT SYSDATE FROM dual;
格式化日期SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
當計算機用SELECT 1+2 FROM dual;回傳 3
取得序列下一值SELECT seq_name.NEXTVAL FROM dual;序列必須透過 DUAL 取值
測試函數/運算式SELECT UPPER('abc'), LENGTH('hello') FROM dual;

進階:DUAL 在優化器中的特殊處理

  • Oracle 10g 起,優化器識別 FROM dual 時會直接產生 FAST DUAL 操作,完全跳過實際表存取,效能極高。
  • 若在 PL/SQL 中大量迴圈呼叫 SELECT ... FROM dual,建議改用直接賦值(如 v_dt := SYSDATE;)避免 SQL 引擎切換開銷。

常見誤區

  • 誤以為 DUAL 有多行:實際只有一行,SELECT * FROM dual UNION SELECT * FROM dual 仍只回傳一行。
  • 嘗試 INSERT/UPDATE DUAL:會報錯 ORA-01752: cannot delete from view without exactly one key-preserved table(視圖限制)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved