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

Oracle DUAL 虛擬表完整用法指南:系統函數、序列、計算器與內部機制

     編輯:Oracle 教學

Oracle DUAL 虛擬表完整用法指南:系統函數、序列、計算器與內部機制

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;
取得 LocaleSELECT 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

DUAL 內部特殊行為(SYS 實測)

  1. INSERT INTO DUAL VALUES ('Y') 可成功插入,COMMIT 後 COUNT(*) 顯示 2 行。
  2. 但 SELECT * FROM DUAL 永遠只回傳原始 'X' 行,新插入行被隱藏。
  3. DELETE FROM DUAL 只刪除 1 行,剩下的仍是 'X' 或剛插入的 'Y'(視刪除順序)。
  4. Oracle 內核強制保證 DUAL 對外僅呈現單一行,內部機制不可見。

警示:切勿 DROP DUAL

DROP TABLE DUAL;  -- 會導致資料庫無法啟動,報 ORA-1092

若誤刪,恢復步驟:

  1. CREATE PFILE='d:pfile.bak' FROM SPFILE
  2. SHUTDOWN IMMEDIATE
  3. 在 PFILE 末尾加入 replication_dependency_tracking = FALSE
  4. STARTUP PFILE='d:pfile.bak'
  5. CREATE TABLE "SYS"."DUAL" (DUMMY VARCHAR2(1));
    INSERT INTO "SYS"."DUAL" VALUES ('X');
    COMMIT;

結論

DUAL 雖為普通表結構,但經 Oracle 內核特殊處理,確保永遠單一行回傳。僅供 SELECT 使用,嚴禁 DDL 操作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved