dual 實際上是一個實際存在的虛表,任何用戶均可讀取oracle用戶默認表空間,存在的目的不是保存數據,而是作為 from的源表。dual 是由sys用戶創建在表空間的。
查詢語句語法格式: * from table;from 指向的表是必需的,即使有些數據不需要任何表。
>select * from dual;
DU
--
X
dual僅有一列為dummy ,該列的數據類型為一個字符長度可變的字符串,且dummy列允許為空。
實例1:使用dual表獲取當前系統日期。
>select sysdate from dual;
SYSDATE
--------------

15-9月 -17
>select to_char(sysdate,''yyyy-mm-dd hh24:mi:ss'') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI:SS'
--------------------------------------
2017-09-15 19:50:05
實例2:當作計算器用,進行算數運算。
>select 1+2 from dual;
當我們對dual表的數據進行修改后oracle用戶默認表空間,任然不影響它作為虛表的查詢結果。但不能刪除它,刪除后使用該表查詢的結果將不能正常完成。
DUAL表可以執行插入、更新、刪除操作,也執行drop操作。但是不要去執行drop表的操作,否則會使系統不能用會報 with ORA-1092錯誤。
PS:如果DUAL表被“不幸”刪除后的恢復:
用sys用戶登陸。
創建DUAL表。
授予公眾SELECT權限(SQL如上述,但不要給UPDATE,INSERT,DELETE權限)。
向DUAL表插入一條記錄(僅此一條): insert into dual values(''X'');
提交修改。
具體操作:
用sys用戶登陸。

SQL> create pfile=’d:/pfile.bak’ from spfile
SQL> shutdown immediate
在d:/pfile.bak文件中最后加入一條:replication_dependency_tracking = FALSE
重新啟動數據庫:
SQL> startup pfile=’d:/pfile.bak’
SQL> create table “sys”.”DUAL”
( “DUMMY” varchar2(1) )
pctfree 10 pctused 4;
SQL> insert into dual values(‘X’);
SQL> commit;
SQL> Grant select on dual to Public;
授權成功。