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
问题原因
循环逻辑顺序错误:
noRow未初始化,默认值为NULL,第一次循环时IF noRow = 0条件不成立,直接执行FETCH- 当游标无数据(或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
相关产品推荐
相关产品推荐

