选择语句挂在oracle

时间:2015-08-24 19:32:51

标签: oracle11g

我有一个奇怪的问题。 考虑以下功能:

create or replace 
function
getCursor()
return sys_refcursor authid current_user
as
q varchar2(32767);
cur sys_refcursor;
begin
    q := '...a long select statement with many tables of 5000 characters...';
    open cur for q;
    return cur;
    close cur;
end;

一个。我在SQL Developer的X时刻调用了这个函数,这个函数在一秒钟之后返回一个结果,这对于这个select语句是正常的(好像它已经在开放代码中使用了)。
B.我在Y时刻(X时刻后10秒)调用此函数,会话挂起 C.我终止了这个会话alter system kill session '58,27105',来自B的函数调用停止了 D.我通过在q变量的随机位置添加一个新行来改变q变量并重新编译该函数,从而不修改查询,只需触摸包含它的字符串。
E.我重复A点,它有效。然后我重复B点,它再次挂起。

可能是什么问题?

1 个答案:

答案 0 :(得分:0)

查询本身没有错,它是你杀死它的函数中的逻辑。

考虑这个过于简单的例子:

  create or replace function f_test ( i in  number )
     return   number
  is
  begin
     dbms_output.put_line ( 'Checkpoint 1' );

     return 1;

     dbms_output.put_line ( 'Checkpoint 2' );

  end;
  /

  Function created.

  SQL> set serverout on
  SQL> select f_test (123 ) from dual;

  F_TEST(123)
  -----------
            1

  Checkpoint 1
  SQL>

注意文字" Checkpoint 2"永远不会到达? 看看你的代码..它永远不会关闭光标..所以下次它运行..它用左手光标进行战斗。

在收盘后将返回移动到函数的最后一行...并再次尝试。