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

MySQL游标FETCH返回所有变量为NULL的问题求助

MySQL游标调用返回全NULL问题解决

问题描述

编写的MySQL存储过程创建无异常,但调用时游标FETCH返回的所有变量均为NULL。最初变量名与游标查询字段名相同,修改后问题仍存在,且所有关联表均有数据。

原存储过程代码

BEGIN
DECLARE noRow int(5);
DECLARE codmensc int(5);
DECLARE titulosc varchar(30);
DECLARE emisorsc varchar(30);
DECLARE nombmedsc varchar(30);
DECLARE cantsc int(5);
DECLARE codmedsc int(5);
DECLARE totsc double(8,2);
DECLARE calo CURSOR FOR
    SELECT m.codmen, m.titulo, m.emisor, me.nombmed, m.cant, m.codmed, m.cant*me.precunit as tot 
    FROM mensaje m 
    JOIN medicina me on m.codmed=me.codmed 
    JOIN cliente c on c.codcli = m.codcli 
    WHERE c.usuario = usuarioactual;
    
DECLARE CONTINUE HANDLER FOR NOT FOUND SET noRow = 0;

OPEN calo;

LOOPROWS: LOOP
        IF noRow = 0 THEN
            CLOSE calo;
            LEAVE LOOPROWS;
        END IF;
        
        FETCH calo INTO codmensc, titulosc, emisorsc, nombmedsc, cantsc, codmedsc, totsc;
        
        SELECT codmensc , titulosc , emisorsc , nombmedsc , cantsc , totsc;

    END LOOP;
END

问题原因

循环逻辑顺序错误:

  1. noRow未初始化,默认值为NULL,第一次循环时IF noRow = 0条件不成立,直接执行FETCH
  2. 当游标无数据(或FETCH到最后一行后),触发NOT FOUND handler将noRow设为0,但此时已经执行了FETCH操作,变量被赋值为NULL,随后的SELECT会输出这些NULL值

修复后的代码

BEGIN
DECLARE noRow int(5) DEFAULT 1; -- 初始化noRow为1,确保第一次循环逻辑正常
DECLARE codmensc int(5);
DECLARE titulosc varchar(30);
DECLARE emisorsc varchar(30);
DECLARE nombmedsc varchar(30);
DECLARE cantsc int(5);
DECLARE codmedsc int(5);
DECLARE totsc double(8,2);
DECLARE calo CURSOR FOR
    SELECT m.codmen, m.titulo, m.emisor, me.nombmed, m.cant, m.codmed, m.cant*me.precunit as tot 
    FROM mensaje m 
    JOIN medicina me on m.codmed=me.codmed 
    JOIN cliente c on c.codcli = m.codcli 
    WHERE c.usuario = usuarioactual;
    
DECLARE CONTINUE HANDLER FOR NOT FOUND SET noRow = 0;

OPEN calo;

LOOPROWS: LOOP
        FETCH calo INTO codmensc, titulosc, emisorsc, nombmedsc, cantsc, codmedsc, totsc; -- 先执行FETCH操作
        IF noRow = 0 THEN -- 再判断是否无数据,触发handler后直接退出循环
            CLOSE calo;
            LEAVE LOOPROWS;
        END IF;
        
        SELECT codmensc , titulosc , emisorsc , nombmedsc , cantsc , totsc;

    END LOOP;
END

额外注意事项

  • 确认存储过程的usuarioactual参数是否正确传递,确保WHERE条件能匹配到数据。如果参数未正确传递,游标查询无结果,也会导致FETCH返回NULL
  • 可以单独执行游标内的SELECT语句,替换usuarioactual为实际值,验证是否能查询到数据,排除数据本身的问题

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

相关产品推荐
方舟 Agent Plan

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

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