li
  当前位置:主页 > 性能优化 > 文章内容
li
9i上使用CONNECT BY访问DUAL表的问题
来源: http://yangtingkun.itpub.net/  作者: yangtingkun    时间:2008-01-26   阅读:5  

这个问题几乎可以肯定是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
IXDBA.NET技术社区
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行。




  上一篇: 数据库升级造成的X_$BH状态异常问...   下一篇: 使用SQL判断一个数是否质数
li
 §相关评论  
 热点文章

·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 编辑推荐
·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 相关篇章
·数据库升级造成的X_$BH状态异常问...
·表异常增大的bug
·Oracle10201在Enterprise Linux ...
·ORA-600(ktsircinfo_num1)错误
·函数索引产生隐藏列
·如何确定导致刷新组刷新失败的物...
·使用当前用户的数据库链的实现
·添加字段对SQL的影响
·如何确定导致刷新组刷新失败的物...
·我的oracle笔记,欢迎收看!
·使用SQL判断一个数是否质数
·缺少GROUP BY表达式可以顺利执行...
·临时表产生REDO过多的bug
·ORA-21561错误
·缺少GROUP BY表达式可以顺利执行...
·Oracle11g物理STANDBY应用日志时...
·用SQL计算100以内的质数
·用SQL实现99乘法表
·使用nlsparam的一个例子
·用SQL解决两道有趣的题(二)
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接