ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 9i上使用CONNECT BY访问DUAL表的问题

9i上使用CONNECT BY访问DUAL表的问题

原创 Linux操作系统 作者:yangtingkun 时间:2008-01-12 00:21:09 0 删除 编辑

这个问题几乎可以肯定是Oracle的策略造成的。

 

 

根据Oracle的策略,访问DUAL可以得到仅且唯一一条记录。如果dual表中存在多条记录或者缺少记录,那么很多Oracle的包都无法执行。

因此,OracleSQL解析器认为DUAL表中有且仅有一条记录,即使你插入新的记录,SELECT * FROM DUAL,仍然返回1条记录。

SQL> CONN SYS@TESTDATA AS SYSDBA
输入口令: *******
已连接。

SQL> SELECT * FROM DUAL;

D
-
X

SQL> INSERT INTO DUAL VALUES ('X');

已创建 1 行。

SQL> SELECT * FROM DUAL;

D
-
X

SQL> SELECT COUNT(*) FROM DUAL;

  COUNT(*)
----------
         2

SQL> ROLLBACK;

回退已完成。

因此,Oracle在处理下面的语句时,就犯了相同的错误:

SQL> SELECT * FROM V$VERSION;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 -
Production
PL/SQL Release 9.2.0.4.0 - Production
CORE    9.2.0.3.0       Production
TNS for Linux: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production

SQL> SELECT * FROM (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL < 10);

        RN
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9

已选择9行。

虽然直接查询无法得到结果,但是通过嵌套查询还是可以得到正确的答案的。

这个问题在10g中已经被解决:

SQL> CONN TEST/TEST@TESTZJ
已连接。
SQL> SELECT * FROM V$VERSION;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE    10.2.0.3.0      Production
TNS for Linux: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production

SQL> SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL < 10;

        RN
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9

已选择9行。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-136136/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10366651