快速计算游标行的方法

时间:2014-11-18 15:57:50

标签: sql oracle stored-procedures plsql cursor

我有一些数据检索逻辑到存储过程中。 它返回一个游标,其中包含在此存储过程中定义的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查询:一个用于计数,一个用于获取数据,但这对我来说似乎很难看(代码重新出现,因此风险更大)。

先谢谢。

1 个答案:

答案 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子句。