这个问题几乎可以肯定是Oracle的策略造成的。
根据Oracle的策略,访问DUAL可以得到仅且唯一一条记录。如果dual表中存在多条记录或者缺少记录,那么很多Oracle的包都无法执行。
因此,Oracle的SQL解析器认为DUAL表中有且仅有一条记录,即使你插入新的记录,SELECT * FROM DUAL,仍然返回1条记录。
SQL> CONN SYS@TESTDATA AS SYSDBA
"QJh'@yr:S0输入口令: *******ITPUB个人空间2~|{HCY~ ^I
已连接。ITPUB个人空间$bm'u"]$O/z@M&|
SQL> SELECT * FROM DUAL;
D
-W8J.k"`2T{G0-
U$^RnF
x0X
SQL> INSERT INTO DUAL VALUES ('X');
已创建1行。
SQL> SELECT * FROM DUAL;
D
(bm7\]A,m0-ITPUB个人空间
vTDf|o7^
X
SQL> SELECT COUNT(*) FROM DUAL;
COUNT(*)ITPUB个人空间y'uMF"S
----------
d8ys*@A,_-i/o0 2
SQL> ROLLBACK;
回退已完成。
因此,Oracle在处理下面的语句时,就犯了相同的错误:
SQL> SELECT * FROM V$VERSION;
BANNER
7cd`LzA9UK0----------------------------------------------------------------ITPUB个人空间*mn'b8PO{r
Oracle9iEnterpriseEdition Release9.2.0.4.0 -ProductionITPUB个人空间:u,s"[4U|GgH^gA
PL/SQL Release 9.2.0.4.0 - Production
{&Z b T
a.Y.k6L0CORE 9.2.0.3.0 Production
H*_
z:]8Wk0TNS for Linux: Version 9.2.0.4.0 - Production
#F/ff/q'bL0NLSRTL Version 9.2.0.4.0 - Production
SQL> SELECT * FROM (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL < 10);
RN
3C
g5]n Wv^U0----------ITPUB个人空间'^n#M2U
v8hsJ&F
1ITPUB个人空间c!Qk
Xi:lLR6L
2ITPUB个人空间tG@P
ro/gyg| M
3ITPUB个人空间YD_U+S R6xrSQC
4
)epH"c4C3Nq(E
~0 5ITPUB个人空间k!p~5uNgGO7m?;@
6
9P+B{;Hy@vjCK0 7ITPUB个人空间V0a CoP$] L`5y
8ITPUB个人空间 poYW7i
M(}1S$j
9
已选择9行。
虽然直接查询无法得到结果,但是通过嵌套查询还是可以得到正确的答案的。
这个问题在10g中已经被解决:
SQL> CONN TEST/TEST@TESTZJ
k+X5i;`5u4l0已连接。ITPUB个人空间
Gy~k J
SQL> SELECT * FROM V$VERSION;
BANNERITPUB个人空间$e,yv\c4Zg
----------------------------------------------------------------ITPUB个人空间}'kE.n"f#K:p
Oracle Database10gEnterpriseEdition Release10.2.0.3.0 - 64biITPUB个人空间Pg:uQo_
PL/SQL Release 10.2.0.3.0 - ProductionITPUB个人空间
Sx&i
qZ3oK4U
CORE 10.2.0.3.0 Production
#["R+uNj"_0TNS for Linux: Version 10.2.0.3.0 - ProductionITPUB个人空间z
n;zj?5R
NLSRTL Version 10.2.0.3.0 - Production
SQL> SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL < 10;
RNITPUB个人空间%R&@!R
X0O\)j,p,Y C
----------
7^c N+Vn \zy[0 1
-@D.jGe
v0 2
H]
x*p3Cc0 3ITPUB个人空间"n5I)aK$m _/D)K z$~o
4
Cikg(QlvPu!?0 5
:y(u.s-k*ALu#s6q-b0 6ITPUB个人空间
vC:WZ-A/Re)z
7
fI4qd+]0 8
Lh v\r{a9_0 9
已选择9行。