MySQL存储过程始终返回0问题排查:获取指定表列最大值
问题分析与解决办法
嘿,我一眼就发现问题出在哪啦!你定义存储过程的时候,第二个输入参数col_name的类型设成了INT(10),但列名明明是字符串类型(比如你调用时传的'id'),MySQL遇到这种类型不匹配的情况,会自动把字符串参数转换成数值0。这样一来,你拼接出来的SQL语句其实是:
SELECT max(0) FROM tbl_segment
自然不管查哪个表,结果都是0咯!
修正后的存储过程代码
把col_name的类型改成VARCHAR(40)(和表名参数类型保持一致就好),另外建议给表名和列名加上反引号,避免遇到关键字的时候报错,修正后的代码如下:
DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `GETMAXIMUMID`( IN `tab_name` VARCHAR(40), IN `col_name` VARCHAR(40) -- 这里将INT类型改为VARCHAR类型 ) BEGIN -- 拼接SQL时给表名、列名加反引号,避免关键字冲突 SET @t1 = CONCAT('SELECT max(`', col_name, '`) FROM `', tab_name, '`'); PREPARE stmt3 FROM @t1; EXECUTE stmt3; DEALLOCATE PREPARE stmt3; END$$ DELIMITER ;
调用方式
你原来的调用语句不用改,直接执行就能得到正确结果啦:
CALL GETMAXIMUMID('tbl_segment','id');
如果之后想把查询结果赋值给变量或者返回更结构化的结果,还可以给存储过程加个输出参数,不过目前这样已经能满足你获取列最大值的需求啦!
内容的提问来源于stack exchange,提问作者Charul
相关产品推荐
相关产品推荐

