我有一个奇怪的问题。 考虑以下功能:
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点,它再次挂起。
可能是什么问题?
答案 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"永远不会到达? 看看你的代码..它永远不会关闭光标..所以下次它运行..它用左手光标进行战斗。
在收盘后将返回移动到函数的最后一行...并再次尝试。