【原創】Oracle10g dual表的研究

木頭一個發表於2008-04-16

平臺:WinXP SP2
資料庫版本:10.2.0.1

dual表在Oracle資料庫中經常會被使用,只要是在獲取並沒有實際存在於表裡的資料時,起到了一個“偽表”的作用。如:
SQL>select sysdate from dual;

SYSDATE
------------
16-APR-08

我們來看看dual表裡到底存放了什麼資料。可以看到dual表它只包行一條記錄:
SQL>desc dual
 Name                        Null?    Type
 -------------------------- -------- ------------------------------------
 DUMMY                                VARCHAR2(1)

SQL>select * from dual;

D
-
X

我們來看看資料字典裡的dual到底是什麼樣的表。它實際是SYS使用者下的一張表,並且建立了public synonym供所有資料庫的所有使用者使用。

SQL>col object_name for a20
SQL>select owner, object_name , object_type from dba_objects where object_name ='DUAL';

OWNER                          OBJECT_NAME          OBJECT_TYPE
------------------------------ -------------------- -------------------
SYS                            DUAL                 TABLE
PUBLIC                         DUAL                 SYNONYM

但dual表與其他表相比,有一些獨特的地方,具體的實驗如下:

A、insert操作:

1、insert一條記錄到dual,可以看到insert操作可以成功執行
SQL>insert into dual values(1);

1 row created.

2、但是通過select看到並沒有真正insert進去
SQL>select count(*) from dual;

  COUNT(*)
----------
         1

3、而且如果這時候shutdwon資料庫,必須顯式的commit或rollback
SQL>shut immediate
ORA-01097: cannot shutdown while in a transaction - commit or rollback first

4、使用toad等工具會發現記錄實際上是insert進去了,只是Oracle對dual的select結果進行了處理,並沒有顯示出來這條記錄

5、由於資料實際上insert進去了,所以在insert後drop dual表會出錯
SQL>drop table dual;
drop table dual
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01422: exact fetch returns more than requested number of rows

6、從上面的實驗可以看出dual表在insert後資料會存在不一致的情況,解決辦法如下:
SQL>truncate table dual;

SQL>insert into dual values('X');

SQL>commit;


B、delete操作:

對於dual表的delete操作會出現錯誤,無法成功執行
SQL>delete table dual;
delete table dual
       *
ERROR at line 1:
ORA-00903: invalid table name

C、update操作:

對於dual表的update操作可以正常進行
SQL>update dual set dummy='Y';

1 row updated.

SQL>select * from dual;

D
-
Y

從上面的實驗可以看出Oracle對於dual有一些獨特的限制,主要為了保證dual表只有一條記錄,但可能也會引發另外的一些問題,所以上述測試只能在測試環境中進行,絕對不要在生產庫上進行。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/498744/viewspace-239009/,如需轉載,請註明出處,否則將追究法律責任。

相關文章