閱讀363 返回首頁    go 阿裏雲 go 技術社區[雲棲]


oracle中的dual詳解


對於Oracle的dual,有以下幾點我們需要明確:

 

第一點
dual不是縮寫詞而是完整的單詞。dual名詞意思是對數,做形容詞時是指二重的,二元的。

 

第二點
Oracle中的dual表是一個單行單列的虛擬表。

 

第三點
Dual表是oracle與數據字典一起自動創建的一個表,這個表隻有1列DUMMY,數據類型為VERCHAR2(1),dual表中隻有一個數據'X', Oracle有內部邏輯保證dual表中永遠隻有一條數據。

 

第四點
Dual表主要用來選擇係統變量或求一個表達式的值。

 

第五點
最常見的一個簡單的例子SELECT sysdate FROM daul
Oracle的SELECT語法的限製為 SELECT * | [column1 [AS alias1], column2 [AS alias2]] FROM table
所以沒有表名就沒有辦法查詢,而時間日期並不存放在任何表中,於是這個dual虛擬表的概念就被引入了。

 


DUAL表的用途

dual是Oracle中的一個實際存在的表,任何用戶均可讀取,常用在沒有目標表的Select語句塊中。

 

查看當前連接用戶
select user from dual;
SYSTEM

 

查看當前日期、時間
select sysdate from dual;
2007-1-24 1

 

日期轉換
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
2007-01-24 15:02:47

 

當作計算器用
select 1+2 from dual;
3

 

創建查看序列值
create sequence aaa increment by 1 start with 1;
select aaa.nextval from dual;
1

select aaa.currval from dual;
1

 


DUAL就是個一行一列的表,如果你往裏執行insert,delete,truncate操作,就會導致很多程序出問題。結果也因sql*plus、pl/sql dev等工具而異。假我們插入想dual插入一條數據,那會是什麼結果呢?

insert into dual values('Y');


select * from dual;
DUMMY
-----
X
Y


select sysdate from dual;
SYSDATE
-----------
2004-12-15
2004-12-15


這個時候返回的是兩條記錄,會引起問題。在通過使用select sysdate into v_sysdate from dual來獲取時間或者其他信息的存儲過程來說,ORACLE會拋出TOO_MANY_ROWS(ORA-01422)異常。

因此,需要保證在DUAL表內有且僅有一條記錄,不能把DUAL表的UPDATE,INSERT,DELETE權限隨意釋放出去,這樣對於係統是很危險的。

 

如果不小心把dual刪除了,是可以恢複的。網上很多資料。
 
原帖地址:https://yesican.blog.51cto.com/700694/269814

 

最後更新:2017-04-03 07:57:23

  上一篇:go ajax效果模擬——隱藏的iframe無刷新效果
  下一篇:go jQuery中的$.extend方法來擴展JSON對象