【发布时间】:2015-01-15 21:19:48
【问题描述】:
我有一些数据检索逻辑到存储过程中。 它返回一个游标,其中包含此存储过程中定义的 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;
}
但这似乎很糟糕:代码冗余,因此它增加了在必须进行更新时忘记其中一种方法的风险。
所以我的问题是:是否可以创建一个存储过程来返回另一个存储过程返回的 a 的行数?
如何重构查询的 SQL 代码以便能够计算行数?最简单但解决方案是编写 2 个单独的 SQL 查询:一个用于计数,一个用于获取数据,但这对我来说似乎很难看(代码冗余和更多错误风险)。
提前致谢。
【问题讨论】:
-
我认为你的问题的答案是肯定的。但是:分享您的研究对每个人都有帮助。告诉我们您尝试了什么以及为什么它不能满足您的需求。这表明您已经花时间尝试帮助自己,它使我们免于重复明显的答案,最重要的是它可以帮助您获得更具体和相关的答案!另见how to ask
-
你有没有尝试使用
%rowcount光标属性,我想这就是你可能要找的 -
使用 %rowcount 需要获取游标吗?我正在寻找一种在 2 个存储过程中使用相同 SQL 代码的解决方案:一种用于提供数据集(可能很慢),另一种用于仅提供行数(必须很快)。
-
直到你
fetch最后一行时才知道游标检索到的行数。 -
@mustaccio 是的,不幸的是,我怎样才能在不复制 SQL 逻辑的情况下制作上面的公开案例?
标签: sql oracle stored-procedures plsql cursor