oracle數據庫裏dual表是什麼表?

這幾天一直在研究oracle,常常會用到dual這個系統表,dual表到底是一個什麼表?帶着疑問google了一下,現在總結一下:

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;

 

附: ORACLE關於DUAL表不同尋常特性的解釋
There is internalized code that makes this happen. Code checks that ensure that a table scan of SYS.DUAL only returns one row. Svrmgrl behaviour is incorrect but this is now an obsolete product. The base issue you should always remember and keep is: DUAL table should always have 1 ROW. Dual is a normal table with one dummy column of varchar2(1). This is basically used from several applications as a pseudo table for getting results from a select statement that use functions like sysdate or other prebuilt or application functions. If DUAL has no rows at all some applications (that use DUAL) may fail with NO_DATA_FOUND exception. If DUAL has more than 1 row then applications (that use DUAL) may fail with TOO_MANY_ROWS exception. So DUAL should ALWAYS have 1 and only 1 row.

發佈了41 篇原創文章 · 獲贊 11 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章