12

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

4

12 回答 12

26

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;
/
于 2016-01-07T10:50:46.223 回答
19

您必须打开游标,然后获取并计算每一行。没有其他方法会起作用。

于 2012-03-14T18:18:48.677 回答
4

您还可以使用 BULK COLLECT 以便不需要 LOOP,

DECLARE
    CURSOR c 
    IS   SELECT *
           FROM employee;
    TYPE emp_tab IS TABLE OF c%ROWTYPE INDEX BY BINARY_INTEGER;
    v_emp_tab emp_tab;
BEGIN
    OPEN c;
    FETCH c BULK COLLECT INTO v_emp_tab;
    DBMS_OUTPUT.PUT_LINE(v_emp_tab.COUNT);
    CLOSE c;
END;
/

编辑:将 employee%ROWTYPE 更改为 c%ROWTYPE

于 2018-05-11T09:04:57.940 回答
1

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

dbms_output.put_line(TO_CHAR(cur%rowcount));
于 2018-05-08T04:36:36.973 回答
1

这应该适合你

DECLARE

  CURSOR get_data_ IS 
    SELECT * 
    FROM   table_abc_ 
    WHERE  owner = user_; -- your query
  counter_ NUMBER:= 0;

BEGIN

  FOR data_ IN get_data_ LOOP
    counter_ := counter_ + 1;
  END LOOP;
  dbms_output.put_line (counter_);

END;
于 2019-08-06T11:43:49.433 回答
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
于 2018-07-13T11:52:56.760 回答
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;
于 2018-10-03T12:53:34.663 回答
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 ;

提取的第一行具有记录数。必须添加获取的特定列(使用 * 不起作用),并且可以添加额外的过滤器。

于 2019-08-29T18:48:42.517 回答
0

试试这个:

print(len(list(cursor)))
于 2021-06-25T17:00:59.120 回答
0

我总是读到人们循环遍历结果。为什么不使用计数(*)?

我的生产代码中的一个示例:

PROCEDURE DeleteStuff___(paras_ IN Parameters_Type_Rec)
IS
   
   CURSOR findEntries_ IS
      select * from MyTable
      where order_no = paras_.order_no;
      
   counter_ NUMBER;
   CURSOR findEntries_count_ IS
      SELECT COUNT(*) from MyTable
      where order_no = paras_.order_no;
BEGIN
   OPEN findEntries_count_;
   FETCH findEntries_count_ INTO counter_;
   CLOSE findEntries_count_;
   dbms_output.put_line('total records found: '||counter_);
   
   IF (counter_ = 0) THEN
      -- log and leave procedure
      RETURN;
   END IF;
   
   FOR order_rec_ IN findEntries_ LOOP
   EXIT WHEN findEntries_%NOTFOUND OR findEntries_%NOTFOUND IS NULL;
      -- do stuff - i.e. delete a record.
      API_Package.Delete(order_rec_);
   END LOOP;
END DeleteStuff___;

如果查询很小,那是我的首选方式。在此示例中,我只想知道(并记录)我将删除多少条目。

ps 忽略三个下划线。在 IFS 中,当您需要私有过程或函数时使用它。

于 2021-10-20T08:21:57.730 回答
-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;
于 2015-12-11T18:58:28.457 回答
-7

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

例如:

DECLARE
  CURSOR lcCursor IS
  SELECT *
    FROM DUAL;
BEGIN
  OPEN lcCursor ;
  DBMS_OUTPUT.PUT_LINE(lcCursor%ROWCOUNT);
  CLOSE lcCursor ;
END;
于 2011-02-08T14:30:35.053 回答