MySQL存储过程返回空结果集,但直接执行查询成功求助
问题原因及解决方案
核心问题
- 字符串拼接缺失单引号+未用动态SQL:你拼接
mywhere时,没给字符串类型的myuniv加单引号,生成的条件变成o.univ = UofU,MySQL会把UofU当成列名而非字符串值,匹配不到数据。同时直接在WHERE里用字符串变量mywhere,MySQL不会将其解析为SQL条件,只会做普通字符串判断,这是结果为空的关键。 - 参数列表语法错误:
IN myuniv text(10),末尾多了一个逗号,属于语法问题,需要删除。
修复方案(两种可选)
方案1:直接用参数作为条件(推荐,避免SQL注入)
无需拼接字符串,直接把参数代入WHERE子句,安全高效:
CREATE DEFINER=`fsadmin`@`142.184.89.102` PROCEDURE `getgroups`( IN mysessid text(5), IN myuniv text(10) ) BEGIN IF myuniv != "N/A" THEN select * from groupover o left join groupatt a on o.myindex = a.myindex and a.sessid = mysessid where o.univ = myuniv; END IF; END
方案2:使用动态SQL(适合复杂条件场景)
如果必须用动态SQL,要给字符串参数加单引号,并用PREPARE和EXECUTE执行:
CREATE DEFINER=`fsadmin`@`142.184.89.102` PROCEDURE `getgroups`( IN mysessid text(5), IN myuniv text(10) ) BEGIN declare mysql longtext; IF myuniv != "N/A" THEN set mysql = concat( "select * from groupover o ", "left join groupatt a on o.myindex = a.myindex and a.sessid = '", mysessid, "' ", "where o.univ = '", myuniv, "'" ); PREPARE stmt FROM mysql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; END
调用说明
修复后执行原调用语句即可:
call getgroups("20231","UofU");
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

