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-02 16:48:03