网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  深入讲解游标类型为什么会产生数据检索     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:125次  录入:管理员--2008-04-09  
 

【赛迪网-it技术报道】游标类型产生的数据检索问题:

现象:

在将数据库兼容的级别从80改到90以后, 下文中的游标循环不出数据, 单独select却会有结果:

declare mycursor cursor local read_only

for

select

col1

from tbname with(nolock)

where name like 'snet%'

and b_key in(

select top(100)

keyid

from tbmaster with(nolock)

where date >= '01/01/2007'

and date < '02/01/2007')

open mycursor

fetch next from mycursor

while (@@fetch_status=0)

begin

fetch next from mycursor

end

close mycursor

deallocate mycursor

原因:

游标类型的问题。

参照以上的定义, 游标类型是: dynamic

在定义此类游标的情况下, s锁是必须下的, nolock提示并不会起作用,此现象通过查询游标open时的sp_lock信息就可以观察得到。它产生了is和s锁。

而nolock 提示是否起作用, 会影响的执行的结果(执行计划一样, 但在取数据的时候, 却会有所差异)

对于下面这句, 有nolock 和无nolock 时, 它取的数据是不一样的, 因为它只取了top 100, 而且没有order by 来保证取数的顺序, 所以取数据顺序的细致差异, 就导致了最终结果的不同. 而最终结果的不同, 导致了整个游标取出来的数据不同。

select top(100)

keyid

from tbmaster with(nolock)

where date >= '01/01/2007'

and date < '02/01/2007')

在游标定义select 语句中, 当nolock 有效时, 是可以取到数据的, 但nolock 无效(dynamic 游标导致)时, 查询结果是无数据的

所以最终看到的结果是: 游标循环不出来数据, 但只做查询却有数据。

如果把游标定义中的查询语句的nolock 去掉做查询, 也会没有数据(与dynamic 游标结果一致)

故这个问题严格来说不应该是兼容级别的问题, 在80 级别下, 还是有可能发生, 只是机率更小, 或者是内部执行原理不太一样, 导致没有这种情况出来而已

由于没有order by来保证顺序, 而有无nolock的数据可能不会一样, 所以80与90下都可能出现问题, 只是90会显得比较突出, 或者仅仅时正好被发现了。

解决方法如下:

首先,需要把游标定义改成下面的,这样不会导致nolock 失效, 而且速度比原来的定义方式快得多. 如果游标一定要与原始表的数据变化关联起来, 建议用keyset, 或者是去掉nolock 提示(因为没有意义), 假如对取的数据有要求, 我们还应当考虑加order by来保证取数顺序:

declare mycursor cursor local forward_only read_only static

for

 
 
上一篇: 调用存储过程时注意要使用output做修饰符    下一篇: 怎样才能提高oracle 10g增量备份速度
  相关文档
如何为用户提供回滚操作时间的准确评估 01-29
解析:oracle热备期间过量redo生成控制 11-15
深入讲解oracle 11g中的一些实用新特性 (1) 01-30
Oracle中通过触发器监视系统使用情况 04-11
细化解析:oracle数据库的空间使用和管理 11-15
讲解forall与bulk collect的使用方法 05-12
灵活应用oracle数据查询时经常用到的关联 03-03
全面讲解归档可用的缓冲大小和数量调整 04-16
深入讲解vb与oracle数据库的日期转换 02-29
教你轻松解决不能一次创建多表的问题 11-15
教你快速掌握oracle数据库的备份策略 04-14
教你通过任务和管道异步调用存储过程 04-11
快速掌握重启oracle数据库的操作步骤 04-17
Oracle系统中表外键的更名 01-15
用oracle的功能特性提高应用的执行效率 (1) 03-24
如果有输出参数则必须使用output做修饰符 04-01
奥运选手博客晒心情 满"博"尽是分享与理解 08-12
使用t-sql强制所有用户退出当前数据库 07-17
个人经验总结:oracle 10g手工创建数据库 08-11
oracle数据库中fast刷新会受到哪些限制 04-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息