0

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

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

任何帮助和意见将不胜感激。谢谢。

4

2 回答 2

4

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

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

查询可能需要很长时间才能发现没有更多的行。考虑一个没有索引的 10,000,000 行的表。查询可能会全面扫描表并找到与条件匹配的第一行。它仍然必须扫描接下来的 9,999,999 行才能发现它们没有。这可能需要一段时间。

于 2011-03-01T22:30:58.380 回答
1

既然您说该过程挂起,那么您的光标是否有可能执行“选择更新”而不是“选择”?由于您说获取多条记录不会导致此错误,因此可能并非如此。

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

此外,您可以使用以下查询检查 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>'
于 2011-03-01T21:32:56.953 回答