DUAL 是 Oracle 內建單列單行虛擬表(DUMMY VARCHAR2(1),值為 'X'),用於滿足 SELECT ... FROM 語法要求。本文整理常見用法與內部特殊行為。
| 場景 | SQL | 說明 |
|---|---|---|
| 查看當前用戶 | SELECT USER FROM DUAL; | |
| 取得系統時間 | SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM DUAL; | |
| 取得主機名 | SELECT SYS_CONTEXT('USERENV','TERMINAL') FROM DUAL; | |
| 取得 Locale | SELECT SYS_CONTEXT('USERENV','LANGUAGE') FROM DUAL; | |
| 產生隨機數 | SELECT DBMS_RANDOM.RANDOM FROM DUAL; | |
| 序列下一值 | SELECT seq_name.NEXTVAL FROM DUAL; | |
| 序列當前值 | SELECT seq_name.CURRVAL FROM DUAL; | |
| 簡易計算器 | SELECT 7*9 FROM DUAL; | 回傳 63 |
INSERT INTO DUAL VALUES ('Y') 可成功插入,COMMIT 後 COUNT(*) 顯示 2 行。SELECT * FROM DUAL 永遠只回傳原始 'X' 行,新插入行被隱藏。DELETE FROM DUAL 只刪除 1 行,剩下的仍是 'X' 或剛插入的 'Y'(視刪除順序)。DUAL 對外僅呈現單一行,內部機制不可見。DROP TABLE DUAL; -- 會導致資料庫無法啟動,報 ORA-1092
若誤刪,恢復步驟:
CREATE PFILE='d:pfile.bak' FROM SPFILESHUTDOWN IMMEDIATEreplication_dependency_tracking = FALSESTARTUP PFILE='d:pfile.bak'CREATE TABLE "SYS"."DUAL" (DUMMY VARCHAR2(1));INSERT INTO "SYS"."DUAL" VALUES ('X');COMMIT;DUAL 雖為普通表結構,但經 Oracle 內核特殊處理,確保永遠單一行回傳。僅供 SELECT 使用,嚴禁 DDL 操作。