发表于: 2008.01.12 00:20
分类: ORACLE , Bug
出处: http://yangtingkun.itpub.net/post/468/451080
---------------------------------------------------------------
这个问题几乎可以肯定是Oracle的策略造成的。
根据Oracle的策略,访问DUAL可以得到仅且唯一一条记录。如果dual表中存在多条记录或者缺少记录,那么很多Oracle的包都无法执行。
因此,Oracle的SQL解析器认为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行。











