DUAL是Oracle與數據字典壹起自動創建的壹個表,它只有壹列:DUMMY,其數據類型為:VARCHAR2(1)。DUAL中只有壹行數據:'X'。DUAL屬於SYS模式,但所有用戶都可以使用DUAL名稱訪問它。用SELECT計算常量表達式、偽列等值時常用該表,因為它只返回壹行數據,而使用其它表時可能返回多個數據行。
查看表結構:desc dual;
執行select * from dual;裏面只有壹條記錄,插入壹條記錄,insert into dual values('Y');後,再次查詢dual表,裏面任然顯示壹條記錄。剛才插入的那條記錄並沒有顯示出來。明明DUAL表中有兩條記錄,可就是只顯示壹條。再試壹下刪除,狠壹點,全刪光,也只有壹條記錄被刪掉。為什麽會這樣呢? 難道SQL的語法對DUAL不起作用嗎?帶著這個疑問, 我查詢了壹些ORACLE官方的資料. 原來ORACLE對DUAL表的操作做了壹些內部處理,盡量保證DUAL表中只返回壹條記錄.當然這寫內部操作是不可見的。看來ORACLE真是蘊藏著無窮的奧妙啊。
dual是壹個oracle內部表,不論我們做什麽操作(不要刪除記錄)它都只有壹條記錄,上面插入了壹條之後,他仍然只有1條記錄,所以很多取系統時間,計算,等只要選擇壹條記錄,而且記錄內容與表內容無關的操作,我們都喜歡使用這個表。虛表(dual)是oracle提供的最小的工作表,它僅包含壹行壹列。對於虛表(dual)來說,其中的列往往是不相關的或無關緊要的。
DUAL?有什麽神秘的?當妳想得到ORACLE系統時間,簡簡單單敲壹行SQL不就得了嗎?故弄玄虛…
SQL> select sysdate from dual;
確實DUAL的使用很方便。但是大家知道DUAL倒底是什麽OBJECT,它有什麽特殊的行為嗎?我們壹起看壹看。首先搞清楚DUAL是什麽OBJECT:
select owner, object_name , object_type from dba_objects where object_name like '%DUAL%';
原來DUAL是屬於SYS schema的壹個表,然後以PUBLIC SYNONYM的方式供其他數據庫USER使用。
1、查看當前用戶,可以在 SQL Plus中執行下面語句
select user from dual;
2、用來調用系統函數
select to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss') from dual;--獲得當前系統時間
select sys_context('userenv','terminal') from dual;--獲得主機名
select sys_context('userenv','language') from dual;--獲得當前locale
select DBMS_RANDOM.random from dual;--獲得壹個隨機數
3、可以用做計算器
select 7*9*10-10 from dual;
4、查看系統時間
select sysdate from dual;