获取的Oracle参考游标的数(Get count of ref cursor in Oracle)

2019-10-19 01:08发布

我有返回引用游标作为输出参数的过程。 我需要找到一种方式来获得的光标节数记录的计数。 目前,我有计数重复这阻碍了性能相同的选择查询获取。

例如:

create or replace package temp 
TYPE metacur IS REF CURSOR;

PROCEDURE prcSumm (
pStartDate          IN          DATE,
pEndDate            IN          DATE,
pKey        IN          NUMBER,
pCursor             OUT         metacur
) ;

  package body temp is

  procedure prcSumm(  
  pStartDate          IN          DATE,
  pEndDate            IN          DATE,
  pKey        IN          NUMBER,
  pCursor             OUT         metacur
   )
 IS
 vCount NUMBER;

 BEGIN

  vCount := 0;

select count(*) into vCount
   from customer c, program p, custprog cp
   where c.custno = cp.custno
   and cp.programid = p.programid
   and p.programid = pKey
   and c.lastupdate >= pStartDate
   and c.lastupdate < pEndDate;

 OPEN pCursor for SELECT 
  c.custno, p.programid, c.fname, c.lname, c.address1, c.address2, cp.plan               
   from customer c, program p, custprog cp
   where c.custno = cp.custno
   and cp.programid = p.programid
   and p.programid = pKey
   and c.lastupdate >= pStartDate
   and c.lastupdate < pEndDate;
    end prcSumm;

有没有办法让在出光标的节数行到vCount。

谢谢!

Answer 1:

Oracle不,在一般情况下,知道有多少行将从游标中读取,直到最后获取的发现没有更多行返回。 由于Oracle不知道有多少行会被退回,你也不能没有获取所有的行(因为你在这里做的,当您重新运行查询)。

除非您使用的是单用户系统或者正在使用非默认的事务隔离级别(这会引入额外的复杂性),也没有保证的行数,你的光标将返回和count(*)第二查询返回将匹配。 这是完全可能的,另一个会话提交你打开光标,你跑的时候时间之间的变化count(*)

如果你真的有决心,以产生精确的计数,你可以添加一个cnt定义为列count(*) over ()来查询您正在使用打开游标。 然后在光标每一行都将有一列cnt它会告诉你将要返回的行的总数。 Oracle必须做更多的工作来生成cnt ,但它比运行相同的查询两次工作量少。

在结构上,虽然,它没有意义返回结果,并从同一段代码计数。 确定计数的东西,调用者应该负责,因为调用者必须能够通过的结果进行迭代。 每个来电者应该能够处理明显边界的情况下(即查询返回0行),而无需单独计数。 和每一个来电者应该能够通过的结果,而不需要知道有多少结果会有迭代。 我见过有人试图遵循回归光标和计数的格局每一次,正确的答案已重新设计的程序和修复主叫方任何错误提示的设计。



文章来源: Get count of ref cursor in Oracle
标签: oracle cursor