从pl / sql中的游标计数行

时间:2016-08-09 08:19:47

标签: sql oracle

我正在尝试计算将从sql语句返回的行数。该语句位于游标

我的代码就像这样

protected

它不起作用

有没有其他解决方案让我计算游标结果的行数,我真的没有人

感谢帮助者

3 个答案:

答案 0 :(得分:2)

如果您的目标是重用现有的游标定义而不必重复基于它的查询,则可以循环其结果以获得计数:

set serveroutput on
declare
  v_counter pls_integer := 0;
  cursor get_sth is select * from all_tables where owner = user; -- your query
begin
  for sth in get_sth loop
    v_counter := v_counter + 1;
  end loop;
  dbms_output.put_line (v_counter);
end;
/

您无法计算结果集中的行而无需获取它们(光标循环所执行的行)。 (@MarcinWroblewski展示了另一种方式,使用显式提取)。无论哪种方式,进程都会使用游标。如果您希望在计算后对返回的数据执行任何操作,则必须重新执行并重新获取光标。

答案 1 :(得分:1)

怎么样?
DECLARE
     CURSOR get_sth IS
          SELECT * FROM table1 WHERE condit..;
     sth       get_sth%ROWTYPE;
     v_counter NUMBER;
BEGIN
     OPEN get_sth;
     LOOP
          FETCH get_sth
               INTO sth;
          EXIT WHEN get_sth%NOTFOUND;
     END LOOP;
     v_counter := get_sth%ROWCOUNT;
     dbms_output.put_line(v_counter);
     CLOSE get_sth;
END;
/

如果您已经拥有光标并且只想知道它返回了多少条记录,那么您必须全部获取它们

buffer = StringIO.StringIO()
canvas = pylab.get_current_fig_manager().canvas
canvas.draw()
pilImage = PIL.Image.fromstring("RGB", canvas.get_width_height(), canvas.tostring_rgb())
pilImage.save(buffer, "PNG")
response = HttpResponse(buffer.getvalue(), content_type="image/png")
return response

答案 2 :(得分:-1)

to optimize runnign time take de cursor code and get into the body code


  CURSOR MOVIMIENTO_ACTIV IS
   SELECT  X.CODMODFUE
         , X.COD_DEP
         , X.CODTIPREC
         , SUM(X.VLR_COSTO)
         , X.COD_ACTIVIDAD
         , X.PERIODO
         , Y.CLASE
         , Y.ESTADO
         , Y.redistri
         , X.recurso
         , ROWNUM NUMERO
   FROM COS_MOVIMIENTO X
      , COS_NIVELES Y
   WHERE X.EMPRESA         = PEMP AND 
         X.EMPRESA         = Y.EMPRESA AND
         X.COD_ACTIVIDAD     = Y.COD_NIVEL AND
         X.PERIODO         = PPER AND 
         Y.CLASE = 'G' AND
         Y.ESTADO='A' AND
         Y.redistRI = 'S'
   GROUP BY X.CODMODFUE
         , X.COD_DEP
         , X.CODTIPREC
         , X.COD_ACTIVIDAD
         , X.PERIODO
         , Y.CLASE
         , Y.ESTADO
         , Y.redistri
         , X.recurso      
         ;




begin

SELECT COUNT(*) FROM (SELECT  X.CODMODFUE
         , X.COD_DEP
         , X.CODTIPREC
         , SUM(X.VLR_COSTO)
         , X.COD_ACTIVIDAD
         , X.PERIODO
         , Y.CLASE
         , Y.ESTADO
         , Y.redistri
         , X.recurso
   FROM COS_MOVIMIENTO X
      , COS_NIVELES Y
   WHERE X.EMPRESA         = '01' AND 
         X.EMPRESA         = Y.EMPRESA AND
         X.COD_ACTIVIDAD     = Y.COD_NIVEL AND
         X.PERIODO         = '201803' AND 
         Y.CLASE = 'G' AND
         Y.ESTADO='A' AND
         Y.redistRI = 'S'
GROUP BY X.CODMODFUE
         , X.COD_DEP
         , X.CODTIPREC
         , X.COD_ACTIVIDAD
         , X.PERIODO
         , Y.CLASE
         , Y.ESTADO
         , Y.redistri
         , X.recurso      


  )W
    end;