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

如果Oracle ref cursor fetch包含1条记录,则它将挂起,oracle,stored-procedures,fetch,sys-refcursor,Oracle,Stored Procedures,Fetch,Sys Refcursor,我现在有一个奇怪的问题,如果从只有一条记录的存储过程返回一个ref游标,fetch操作将挂起并冻结。存储过程执行速度非常快,只是抓取过程挂起。如果ref游标有多条记录,则一切正常。以前有人有过类似的问题吗 Oracle服务器是在Linus上运行的11g。客户端是Windows Server 2003。我正在Windows服务器上使用通用的Oracle sqlplus工具对此进行测试 如有任何帮助和意见,将不胜感激。谢谢。既然您说进程挂起,您的光标是否有可能执行“选择更新”而不是“选择”?由于您的

我现在有一个奇怪的问题,如果从只有一条记录的存储过程返回一个ref游标,fetch操作将挂起并冻结。存储过程执行速度非常快,只是抓取过程挂起。如果ref游标有多条记录,则一切正常。以前有人有过类似的问题吗

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


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

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

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

此外,您还可以使用以下查询检查v$locked_对象,并输入表名,以查看相关对象是否被锁定。同样,除非当前查询具有“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>'
选择do.*
从v$locked_对象vo,
dba_对象做什么
其中vo.object\u id=do.object\u id
和vo.object_name=''

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

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

此外,您还可以使用以下查询检查v$locked_对象,并输入表名,以查看相关对象是否被锁定。同样,除非当前查询具有“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>'
选择do.*
从v$locked_对象vo,
dba_对象做什么
其中vo.object\u id=do.object\u id
和vo.object_name=''

你说挂起是什么意思

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


可能是查询花费了很长时间才发现没有更多的行。考虑一个没有索引的10000000行表。查询可能会完全扫描表,并发现第一行与条件匹配。它仍然需要扫描接下来的9999999行才能发现它们没有。那可能需要一段时间。

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

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


可能是查询花费了很长时间才发现没有更多的行。考虑一个没有索引的10000000行表。查询可能会完全扫描表,并发现第一行与条件匹配。它仍然需要扫描接下来的9999999行才能发现它们没有。那可能需要一段时间。

你能给我们看一下程序吗?你能给我们看一下程序吗?