如果Oracle ref cursor fetch包含1条单个记录,则它将挂起

时间:2011-03-01 21:24:01

标签: oracle stored-procedures fetch sys-refcursor

我现在有一个奇怪的问题,如果从一个只有1条记录的存储过程返回一个引用游标,则获取操作将挂起并冻结。存储过程执行非常快,只是提取过程挂起。如果引用游标有超过1条记录,那么一切都很好。有没有人之前有类似的问题?

在Linus上运行的Oracle服务器是11g。客户端是Windows Server 2003.我正在使用Windows Server上的通用Oracle sqlplus工具对此进行测试。

非常感谢任何帮助和评论。感谢。

2 个答案:

答案 0 :(得分:4)

当你说挂起时,你的意思是什么?

如果会话在数据库中仍处于活动状态(V $ SESSION中的状态),则它可能正在等待某个事件(例如,来自客户端的SQL * Net意味着它正在等待客户端执行某些操作)。

可能是查询花了很长时间才发现没有更多行。考虑一个10,000,000行没有索引的表。查询可以完全扫描表并找到符合条件的第一行。它仍然必须扫描下一个9,999,999行,发现它们没有。这可能需要一段时间。

答案 1 :(得分:1)

由于您说该过程挂起,您的光标是否有可能执行“select for Update”而不是“Select”?由于您说多个记录的提取不会导致此错误,因此情况可能并非如此。

您能否向我们展示您的选择和获取的代码(或可重复的小测试/样本)。

此外,您可以使用以下查询检查v $ locked_objects并在表名中给出以查看相关对象是否被锁定。同样,除非您当前的查询具有“for update”,否则此提取不应该挂起。

select do.* 
  from v$locked_objects vo,
       dba_objects      do
  where vo.object_id = do.object_id
    and vo.object_name = '<your_table_name>'