Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在pl/sql中从游标计算行数_Sql_Oracle - Fatal编程技术网

在pl/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 ; / 但它不起作用 有没有其他的解决方案可以让我计算光标结果的行数,我真的不

我试图计算从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;
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;