You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取游标中的行数?cursor_name%rowcount始终返回0

解决游标%rowcount始终返回0的问题

核心原因

cursor_name%rowcount记录的是已经从游标中取出的行数,而非游标包含的总行数。刚打开游标但未执行任何FETCH操作时,它的值默认就是0;如果遍历后仍为0,要么是游标查询没有匹配到数据,要么是你没有正确完成FETCH循环。


解决方法

1. 遍历游标统计总行数

要获取游标实际包含的行数,必须先遍历游标(哪怕只是计数),每执行一次FETCH,%rowcount就会自增1。示例代码:

DECLARE
  CURSOR emp_cursor IS SELECT * FROM employees WHERE department_id = 10;
  emp_rec emp_cursor%ROWTYPE;
BEGIN
  OPEN emp_cursor;
  LOOP
    FETCH emp_cursor INTO emp_rec;
    EXIT WHEN emp_cursor%NOTFOUND;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('游标总行数: ' || emp_cursor%rowcount);
  CLOSE emp_cursor;
END;
/

遍历完成后,emp_cursor%rowcount就会等于游标实际的总行数。

2. 直接查询总行数(无需遍历数据时)

如果只是需要行数,不需要处理游标内的数据,可以先通过COUNT(*)查询得到行数,再使用游标。注意查询条件必须和游标完全一致:

DECLARE
  CURSOR emp_cursor IS SELECT * FROM employees WHERE department_id = 10;
  total_rows NUMBER;
BEGIN
  SELECT COUNT(*) INTO total_rows FROM employees WHERE department_id = 10;
  DBMS_OUTPUT.PUT_LINE('游标总行数: ' || total_rows);
  
  -- 后续正常使用游标
  OPEN emp_cursor;
  -- ... 数据处理逻辑
  CLOSE emp_cursor;
END;
/

这种方式效率更高,避免了遍历游标带来的开销。

3. 使用FOR循环自动统计

如果用FOR循环遍历游标,循环结束后直接读取%rowcount即可,FOR循环会自动处理FETCH和退出逻辑:

DECLARE
  CURSOR emp_cursor IS SELECT * FROM employees WHERE department_id = 10;
BEGIN
  FOR emp_rec IN emp_cursor LOOP
    -- 你的数据处理代码
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('游标总行数: ' || emp_cursor%rowcount);
END;
/

常见误区

  • 不要在OPEN cursor_name后直接读取%rowcount,此时还未取出任何数据,必然返回0。
  • 动态游标(REF CURSOR)的逻辑和静态游标一致,必须执行FETCH操作后才会累计行数。

内容的提问来源于stack exchange,提问作者Prabhu Karthikeyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 02:45:31