【问题标题】:Check row count of before returning ref cursor in PL/sql在 PL/sql 中返回 ref 游标之前检查行数
【发布时间】:2014-02-10 11:15:46
【问题描述】:

在循环中,我正在调用参数化游标。在任何特定步骤中,如果游标返回行,则此循环结束,我必须将游标作为参考游标返回。如何在不执行两次相同查询的情况下检查行数?

procedure pr_test
(
    v_data varray;
    ,ret_data sys_refcursor
)
as
    cursor c_q(x)
    select * from table
    where col1 = x;
    ...
begin
    ...
    for  in 1..v_data.count loop
        open ret_data for c_q(v_data(i));
                 ----- here some logic is required --------
        /*if rowcount of re_data > 0 then
            return ret_data;
        else
            close ret_data;
        end if;*/
    end loop;
end;

【问题讨论】:

  • 那么交易是什么?您打开光标并返回它。如果没有数据,调用者(正在使用游标)只需要处理将引发的 NO_MORE_DATA 异常——无论如何他们都需要这样做,因为最终游标将用完数据。 IMO 将未知且可能大量的行读入内存不是一个可行的解决方案,而且在我的营业地点,这不会通过代码审查。 YMMV。分享和享受。
  • 在代码中你可以看到返回是在for循环里面。事实上,您可以简单地认为目标是在有数据时返回一个游标,否则检查下一个驱动循环元素。如果我们打开游标,它就无法返回。所以对于包含记录的目标游标是无法返回的。

标签: oracle plsql sys-refcursor


【解决方案1】:

没有办法实现这一点。光标充当生产者-消费者设计模式。这意味着没有人知道在完全获取游标之前将重新调整多少行。

在 OCI 中,您可以使用可回绕游标 - 这些游标可以回绕到开头,但据我所知,这些游标无法从 PL/SQL 访问。

【讨论】:

  • Ok .. :( 是否可以使用一些集合?它将用“%ROWTYPE”定义,并且该集合将从过程中返回?
  • @user1027056 是的,在收集的情况下这可以工作。我还要说 in 可能会更快(只要您不将超过 cca 100000 行放入集合中)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 2021-01-21
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
相关资源
最近更新 更多