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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:32:10