我有一些数据检索逻辑到存储过程中。 它返回一个游标,其中包含在此存储过程中定义的SQL查询的内容。
这种格式的东西:
function search_foo(param1 varchar2, param1 varchar3)
return g_ref -- a ref cursor
is
l_return g_ref;
{
open l_return for
select col1_i_need, col2_i_need
from foo
join bar on --[...]
where [...];
return l_return;
}
但是当返回的数据集很大时,我想在获取所有数据集之前计算行数(如果行数太多,则停止检索)。
因此,简单的方法就是定义另一个类似
的函数function search_foo(param1 varchar2, param1 varchar3)
return number
is
l_return number;
{
select count(*) into l_return
from foo
join bar on --[...]
where [...];
return l_return;
}
但它似乎很糟糕:代码重新设置,因此当必须进行更新时,它会增加忘记其中一种方法的风险。
所以我的问题是:是否可以使存储过程返回另一个存储过程返回的行数?
如何重构查询的SQL代码以便能够计算行数?最简单但解决方案是编写两个单独的SQL查询:一个用于计数,一个用于获取数据,但这对我来说似乎很难看(代码重新出现,因此风险更大)。
先谢谢。
答案 0 :(得分:1)
您可以这样做,将变量传递给函数,函数将存储行数:
function search_foo(param1 varchar2, param1 varchar3, PARAM_ROWCOUNT OUT NUMBER) -- here
return g_ref -- a ref cursor
is
l_return g_ref;
{
open l_return for
select col1_i_need, col2_i_need
from foo
join bar on --[...]
where [...];
PARAM_ROWCOUNT := l_return%ROWCOUNT; -- and here
return l_return;
}
UPD:抱歉,您没有注意到要在获取之前查找行数。 不幸的是,这可能是不可能的。 但是,如果您希望存储过程不返回太多行,则始终可以向查询添加WHERE ROWNUM< = 1000子句。