oracle中dual的一些學習了解

2021-10-06 21:25:09 字數 3722 閱讀 3304

進了專案組才正式接觸oracle,以前的都是用的mysql,先前以為dual表是資料庫中的開發人員建立的普通表,當時還傻乎乎的去找,後來才查詢實質了解是怎麼回事,下面是一些參考和總結。

dual是乙個虛擬表,用來構成select的語法規則,oracle保證dual裡面永遠只有一條記錄,可以用它來做很多事情。

1、檢視當前使用者,可以執行下面語句 select user from dual;

2、用來呼叫系統函式

主要是當時用到這個函式

select fn_getpy('學習資料庫',1) from dual;

拼音xuexishujuku

select fn_getpy('學習資料庫',3) 拼音 from dual;

拼音xxsjk

其他的引數差不多都返回的一樣的 ??

chr

語法:  chr(x)

功能:給出整數x,返回對應的ascii碼字元。chr和ascii是一對反函式。

select chr(15045032) 別名1,chr(90) 別名2 from dual;

別名1  別名2

周       z

--------------有個查詢時自己不知道的知識-----------------

有個簡單的檢視方法,開啟記事本,如要檢視「chr(119) w」,可以按下alt+119

(先按住alt不放,然後輸入數字,輸完後在放開)

注意:數字一定要從旁邊的數字鍵盤輸入,否則無效

concat

語法: concat(string1,string2)

功能:連線兩個字串

sql> select concat('010-','88888888')||'23'  連線 from dual;

連線010-8888888823

函式參照引用:

3、得到序列的下乙個值或當前值,用下面語句

select your_sequence.nextval from dual;--獲得序列your_sequence的下乙個值

select your_sequence.currval from dual;--獲得序列your_sequence的當前值

若沒有序列需要建立,create sequence your_sequence;當時我就很奇怪有獲得當前和下個為什麼沒有獲得上個,然後我就去尋找,好吧,無果,就不了了之了。

4、可以用做計算器

select 2*9 from dual; select 2+9 from dual; select 2-9 from dual;select 9*1-1 from dual;

oracle系統中dual表是乙個「神秘」的表,網上有很多網友都對該錶進行了測試,該錶只有一行一列,其實該錶和系統中的其他表一樣,一樣可以執行插入、更新、刪除操作,還可以執行drop操作。但是不要去執行drop表的操作,否則會使系統不能用,資料庫起不了,會報database startup crashes with ora-1092錯誤。此時也不要慌亂,可以通過執行以下步驟來進行恢復。可以用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」

[an error occurred while processing this directive]

dual倒底是什麼object, 它有什麼特殊的行為嗎? 來,我們一起看一看. 首先搞清楚dual是什麼object :

原來dual是屬於sys schema的乙個表,然後以public synonym的方式供其他資料庫user使用.

再看看它的結構:

sql> desc dual name null? type

dummy varchar2(1)

sql>

只有乙個名字叫dummy的字元型column .

然後查詢一下表裡的資料:

sql> select dummy from dual;

dummy

x哦, 只有一條記錄, dummy的值是』x』 .很正常啊,沒什麼奇怪嘛. 好,下面就有奇妙的東西出現了!

插入一條記錄:

sql> connect sys as sysdba

connected.

sql> insert into dual values ( 'y');

1 row created.

sql> commit;

commit complete.

sql> select count(*) from dual;

count(*)

迄今為止,一切正常. 然而當我們再次查詢記錄時,奇怪的事情發生了

sql> select * from dual;

dummy

x剛才插入的那條記錄並沒有顯示出來 ! 明明dual表中有兩條記錄, 可就是只顯示一條!

再試一下刪除 ,狠一點,全刪光 !

sql> delete from dual; /*注意沒有限定條件,試圖刪除全部記錄*/

1 row deleted.

sql> commit;

commit complete.

哈哈,也只有一條記錄被刪掉,

sql> select * from dual;

dummy

y為什麼會這樣呢? 難道sql的語法對dual不起作用嗎?帶著這個疑問,

我查詢了一些oracle官方的資料. 原來oracle對dual表的操作做了一些內部處理,盡量保證dual表中只返回一條記錄.當然這寫內部操作是不可見的 .看來oracle真是蘊藏著無窮的奧妙啊!

然後在這過程中發現在mysql裡也存在和oracle裡類似的dual虛擬表:官方宣告純粹是為了滿足select ... from...這一習慣問題,mysql會忽略對該錶的引用。

select * from dual;    mysql會出錯——1096:沒有使用到表;而oracle 會返回:

select  express [from dual];  mysql總是作為返回該表示式值的普通select語句執行,返回一行記錄的結果集,from dual 對mysql來說根本就是擺設!而oracle裡該句必須有from dual;否則報錯!

select  express from dual where 0=2;   mysq 和 oracle的行為一致:該句就如同你認為的正常表那樣——會先計算where的條件,再行計算express;這裡的where條件會決定expres是否會返回!

參照原文:

進了專案組才正式接觸oracle,以前的都是用的mysql,先前以為dual表是資料庫中的開發人員建立的普通表,當時還傻乎乎的去找,後來才查詢實質了解是怎麼回事,下面是一些參考和總結。

dual的一些巧妙用法

dual 是乙個只有一條記錄的表 select from dual dummy x1,生成序列 select level from dual connect by level 3 select rownum from dual connect by rownum 3 select level fro...

oracle中的dual詳解

對於oracle的dual,有以下幾點我們需要明確 第一點dual不是縮寫詞而是完整的單詞。dual名詞意思是對數,做形容詞時是指二重的,二元的。第二點oracle中的dual表是乙個單行單列的虛擬表。第三點dual表是oracle與資料字典一起自動建立的乙個表,這個表只有1列dummy,資料型別為...

Oracle中dual的解釋

q dual是什麼?a dual是乙個系統表,不能刪除或者修改其表結構。它的名稱叫做 偽表 或者 啞表 檢視其表結構 sql desc dual 名稱 是否為空?型別 dummy varchar2 1 其欄位只有乙個 dummy 中文叫做 啞巴 長度只有1。這個表結構只供參考。oracle的sele...