我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

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

上一篇 / 下一篇  2008-01-12 00:21:09 / 个人分类:Bug

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

 

 

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

因此,OracleSQL解析器认为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`L zA9UK0----------------------------------------------------------------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 bT 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] nWv^U0----------ITPUB个人空间'^n#M2U v8hsJ&F
         1ITPUB个人空间c!Qk Xi:l LR6L
         2ITPUB个人空间tG @P ro/gyg | M
         3ITPUB个人空间 YD_ U+SR6xrSQC
         4
)e pH"c4C3Nq(E ~0         5ITPUB个人空间k!p~5uNgGO7m ?;@
         6
9P+B{;Hy@vjCK0         7ITPUB个人空间V0a CoP$]L`5y
         8ITPUB个人空间 po YW7i 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\c4Z g
----------------------------------------------------------------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^cN+Vn\ zy [0         1
-@D.jGe v0         2
H] x*p3C c0         3ITPUB个人空间"n5I)aK$m_/D)K z$~o
         4
Cikg(QlvP u!?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行。

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar