如何获取游标中的行数?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
相关产品推荐
相关产品推荐

