我正在尝试计算将从sql语句返回的行数。该语句位于游标
中我的代码就像这样
protected
它不起作用
有没有其他解决方案让我计算游标结果的行数,我真的没有人
感谢帮助者
答案 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;