在pl/sql中从游标计算行数
我试图计算从sql语句返回的行数。此语句位于游标中 我的代码是这样的在pl/sql中从游标计算行数,sql,oracle,Sql,Oracle,我试图计算从sql语句返回的行数。此语句位于游标中 我的代码是这样的 DECLARE v_counter int := 0 ; select count(*) into v_counter from ( cursor get_sth is select * from table1 where condit..) ; BEGIN DBMS_OUTPUT.PUT_LINE (v_counter); END ; / 但它不起作用 有没有其他的解决方案可以让我计算光标结果的行数,我真的不
DECLARE
v_counter int := 0 ;
select count(*) into v_counter from (
cursor get_sth is select * from table1 where condit..) ;
BEGIN
DBMS_OUTPUT.PUT_LINE (v_counter);
END ;
/
但它不起作用
有没有其他的解决方案可以让我计算光标结果的行数,我真的不知道
谢谢帮手们怎么样
DECLARE
v_counter INT := 0;
BEGIN
SELECT COUNT(*) INTO v_counter FROM table1 WHERE condit..;
dbms_output.put_line(v_counter);
END;
/
?
若你们已经有了游标,只想知道它返回了多少条记录,那个么你们必须把它们全部取出来
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;
/
如果您的目标是重用现有游标定义,而不必重复它所基于的查询,则可以循环其结果以获得计数:
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展示了另一种方法,即显式抓取)。无论哪种方式,进程都会使用光标。如果要在计算返回的数据后对其执行任何操作,则必须重新执行并重新获取游标。为什么不直接计算表中与条件匹配的行?为什么子查询/游标会尝试?(另外,“它不起作用”没有帮助;请包括您得到的错误和/或错误结果)。它起作用,但我希望通过从游标中获取行数来优化代码,而不在中实现代码above@networker-您所说的“优化我的代码”是什么意思-您是否试图避免对同一查询进行两次编码,是否要重用现有的游标声明?如果这不能真正解决你的问题,那么编辑问题来解释你想做什么可能会有帮助。(虽然你已经接受了ti,所以…)对你的答案添加一个更详细的解释会很有帮助。这并没有回答op的问题。
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;