技术开发 频道

Oracle中神秘的DUAL表的探究

    【IT168 技术文档】

    DUAL ? 有什么神秘的? 当你想得到ORACLE系统时间, 简简单单敲一行SQL 不就得了吗? 故弄玄虚….

SQL>; select sysdate from dual; SYSDATE --------- 28-SEP-03
    确实DUAL的使用很方便. 但是大家知道DUAL倒底是什么OBJECT, 它有什么特殊的行为吗? 来,我们一起看一看.

    首先搞清楚DUAL是什么OBJECT :

SQL>; connect system/manager Connected. SQL>; select owner, object_name , object_type from dba_objects where object_name like '%DUAL%'; OWNER OBJECT_NAME OBJECT_TYPE --------------- --------------- ------------- SYS DUAL TABLE PUBLIC DUAL SYNONYM

    原来DUAL是属于SYS schema的一个表,然后以PUBLIC SYNONYM的方式供其他数据库USER使用.

    再看看它的结构:

SQL>; desc dual Name Null? Type --------------------------------- DUMMY VARCHAR2(1)

    只有一个名字叫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(*) ---------- 2

    迄今为止,一切正常. 然而当我们再次查询记录时,奇怪的事情发生了

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表中只返回一条记录.当然这写内部操作是不可见的 .

0
相关文章