DUAL 是 Oracle 內建的單列單行虛擬表,專為「無需實體表即可執行 SELECT」而設計。本文解析其結構、存在意義與實戰用法。
SQL> DESC dual
Name Null? Type
------ ------- -------------
DUMMY VARCHAR2(1)
DUMMY,型別 VARCHAR2(1),預設值 'X'。SYS 使用者,全體使用者可讀,不可刪除/修改結構。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; |
FROM dual 時會直接產生 FAST DUAL 操作,完全跳過實際表存取,效能極高。SELECT ... FROM dual,建議改用直接賦值(如 v_dt := SYSDATE;)避免 SQL 引擎切換開銷。SELECT * FROM dual UNION SELECT * FROM dual 仍只回傳一行。ORA-01752: cannot delete from view without exactly one key-preserved table(視圖限制)。