【问题标题】:Fast way to count rows of a cursor快速计算游标行数的方法
【发布时间】: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


【解决方案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

【讨论】:

    猜你喜欢
    • 2020-07-07
    • 2013-08-30
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2014-11-12
    • 2019-06-25
    • 2018-09-18
    • 1970-01-01
    相关资源
    最近更新 更多