Oracle存储过程表有记录但游标未输出正确计数问题
问题分析与解决方案
核心问题
你的存储过程计数始终为0,是因为游标语法错误和冗余的循环使用:
- 游标定义中不能包含
INTO V_SPANID_COUNT子句,这是单行SELECT赋值的语法,不能用于游标查询。 - COUNT()函数返回单行结果,完全不需要用FOR循环遍历游标,错误的游标写法导致变量始终保持初始值0。
修正后的代码(最简写法)
直接通过SELECT INTO获取计数,无需游标和循环:
create or replace PROCEDURE PROC_NELENGTH_LESS_THAN_CMMAPPROVED AS V_ERRORS NVARCHAR2(3000); V_SPANID_COUNT NUMBER := 0; BEGIN SELECT COUNT(SPAN_LINK_ID) INTO V_SPANID_COUNT from CMP_PANINDIA_VIEW_AGING_UPD WHERE NE_LENGTH < ROUTE_APPROVED_BY_CMM AND CMM_APPROVED_DATE IS NOT NULL AND MISSING_ASBUILT = 0 AND SPAN_TYPE <> 'FTTX' AND job_progress_flag = 1; dbms_output.put_line('COUNT OF DATA: ' || V_SPANID_COUNT); END PROC_NELENGTH_LESS_THAN_CMMAPPROVED;
若需使用游标(仅作示例)
如果后续需要扩展处理单条记录,可采用标准游标写法(但当前计数需求无需此操作):
create or replace PROCEDURE PROC_NELENGTH_LESS_THAN_CMMAPPROVED AS V_ERRORS NVARCHAR2(3000); V_SPANID_COUNT NUMBER := 0; -- 定义游标,仅查询结果,不带INTO CURSOR CUR_NE_DATA IS SELECT COUNT(SPAN_LINK_ID) AS CNT from CMP_PANINDIA_VIEW_AGING_UPD WHERE NE_LENGTH < ROUTE_APPROVED_BY_CMM AND CMM_APPROVED_DATE IS NOT NULL AND MISSING_ASBUILT = 0 AND SPAN_TYPE <> 'FTTX' AND job_progress_flag = 1; BEGIN -- 打开游标并获取值 OPEN CUR_NE_DATA; FETCH CUR_NE_DATA INTO V_SPANID_COUNT; CLOSE CUR_NE_DATA; dbms_output.put_line('COUNT OF DATA: ' || V_SPANID_COUNT); END PROC_NELENGTH_LESS_THAN_CMMAPPROVED;
内容的提问来源于stack exchange,提问作者Nadeem
相关产品推荐
相关产品推荐

