平台: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博客 ” ,链接:https://blog.itpub.net/498744/viewspace-239009/ ,如需转载,请注明出处,否则将追究法律责任。