如何查找游标中的行数

时间:2011-02-08 14:17:59

标签: oracle plsql cursor

我想找到游标中的行数。有关键字可以提供帮助吗?使用COUNT,我们必须编写一个查询。任何帮助将不胜感激。

10 个答案:

答案 0 :(得分:16)

cursor_variable.%ROWCOUNT是解决方案。但如果你在打开后检查它,它的值将为0。您需要循环遍历所有记录,以获得总行数。示例如下:

DECLARE 
  cur sys_refcursor;
  cur_rec YOUR_TABLE%rowtype;
BEGIN
  OPEN cur FOR
  SELECT * FROM YOUR_TABLE;

  dbms_output.put_line(cur%rowcount);--returning 0

  LOOP
    FETCH cur INTO cur_rec;  
    EXIT WHEN cur%notfound;
    dbms_output.put_line(cur%rowcount);--will return row number beginning with 1
    dbms_output.put_line(cur_rec.SOME_COLUMN);
  END LOOP;

  dbms_output.put_line('Total Rows: ' || cur%rowcount);--here you will get total row count
END;
/

答案 1 :(得分:13)

您必须打开光标,然后获取并计算每一行。没有别的办法。

答案 2 :(得分:1)

您可以使用以下简单的单行代码打印光标计数

dbms_output.put_line(TO_CHAR(cur%rowcount));

答案 3 :(得分:0)

DECLARE @STRVALUE                   NVARCHAR(MAX),
    @CREATEDDATE                DATETIME,
    @STANTANCEVALUE             NVARCHAR(MAX),
    @COUNT                      INT=0,
    @JOBCODE                    NVARCHAR(50)='JOB00123654',
    @DATE                       DATETIME=GETDATE(),
    @NAME                       NVARCHAR(50)='Ramkumar',
    @JOBID                      INT;

    CREATE TABLE #TempContentSplitValue (ITEMS NVARCHAR(200))

    SELECT  @JOBID = i.Id FROM JobHeader_TBL  i WHERE Id=1201;

    IF EXISTS (SELECT 1 FROM JobHeader_TBL WHERE Id=@JOBID)
    BEGIN
        SELECT @STRVALUE= Description from ContentTemplate_TBL where Id=1 

        INSERT INTO #TempContentSplitValue SELECT * FROM dbo.split(@STRVALUE, '_')

        SET @STRVALUE=''

        DECLARE db_contentcursor CURSOR  FOR  SELECT ITEMS FROM #TempContentSplitValue

        OPEN db_contentcursor

        FETCH NEXT FROM db_contentcursor 
        INTO @STANTANCEVALUE

            WHILE (@@FETCH_STATUS = 0)
            BEGIN

            SET @STRVALUE +=  @STANTANCEVALUE + 'JOB00123654'

            SET @COUNT += 1

            SELECT @COUNT

            FETCH NEXT FROM db_contentcursor INTO @STANTANCEVALUE
            END
            CLOSE db_contentcursor
            DEALLOCATE db_contentcursor

            DROP TABLE #TempContentSplitValue

            SELECT @STRVALUE
    END

答案 4 :(得分:0)

在这里,我试图计算年龄大于25岁的客户总数。因此,请首先将结果存储在游标中。然后计算函数内部或主函数本身中游标的大小。

 DECLARE
        cname customer24.cust_name%type;
        count1 integer :=0;
        CURSOR MORETHAN is
        SELECT cust_name
        FROM customer24
        where age>25;   
    BEGIN
        OPEN MORETHAN;
        LOOP
        FETCH MORETHAN into cname;
        count1:=count1+1;
        EXIT WHEN MORETHAN%notfound;
        END LOOP;
       -- dbms_output.put_line(count1);
        dbms_output.put_line(MORETHAN%ROWCOUNT);
        CLOSE MORETHAN;
    END;

答案 5 :(得分:0)

这应该为您工作

{"secret":"xxx","encrypted":"xxxgggxxx"}

答案 6 :(得分:0)

由于通过网络访问数据库服务器(例如,在使用Ajax调用时)会产生开销,因此可能存在一些有用/需要解决的问题

考虑一下:

CURSOR c_data IS
SELECT per_first_name , null my_person_count
  FROM person
 UNION
SELECT null as per_first_name , count( distinct per_id ) as my_person_count
  FROM person
 order by my_person_count ;

提取的第一行具有记录数。一个必须添加获取的特定列(使用*无效),并且一个可以添加其他过滤器。

答案 7 :(得分:0)

试试这个:

print(len(list(cursor)))

答案 8 :(得分:-1)

开始时无法使用光标计数。为此你需要获取完整的光标;这就是获取光标数的方式。

declare
  cursor c2 is select * from dept;
  var c2%rowtype;
  i number :=0;
begin
  open c2;
  loop
    fetch c2 into var;
    exit when c2%NOTFOUND;
    i: = i+1;
  end loop;
  close c2;
dbms_output.put_line('total records in cursor'||i);
end;

答案 9 :(得分:-2)

您可以使用游标的%ROWCOUNT属性。

e.g:

DECLARE
  CURSOR lcCursor IS
  SELECT *
    FROM DUAL;
BEGIN
  OPEN lcCursor ;
  DBMS_OUTPUT.PUT_LINE(lcCursor%ROWCOUNT);
  CLOSE lcCursor ;
END;