MySQL 8.0.32存储过程首次执行后查询无返回结果求助
问题描述
我正在使用MySQL 8.0.32,创建了如下存储过程:
CREATE DEFINER=`root`@`%` PROCEDURE `spTimersCreate`(IN paction bigint, IN preseller bigint, IN pinterval bigint) BEGIN INSERT INTO timers (action, reseller, `interval`, isactive, isdeleted) VALUES (paction, preseller, pinterval, 0, 0); SELECT * FROM timers t WHERE t.id = 1188405; END
执行该存储过程的语句如下:
SET @paction = 1; SET @preseller = 1; SET @pinterval = 1; CALL spTimersCreate(@paction, @preseller, @pinterval);
首次执行时,能正确返回新插入的timers表记录;但后续每次执行,虽能在timers表中正常创建新记录,却无法返回查询结果。
为排查问题,我修改了存储过程:
PROCEDURE spTimersCreate2 (IN paction bigint, IN preseller bigint, IN pinterval bigint) BEGIN INSERT INTO timers (action, reseller, `interval`, isactive, isdeleted) VALUES (paction, preseller, pinterval, 0, 0); SELECT 1188405; END
执行这个版本的存储过程时,每次都能正确返回1188405。我猜测忽略了某些明显问题,恳请大家帮忙解答,谢谢!
问题分析与解决
问题根源是你在查询时使用了硬编码的固定id值1188405:
- 首次执行时,新插入记录的自增id恰好是1188405,所以能匹配到并返回结果;
- 后续执行时,新插入记录的id会随着自增序列递增,不再是1188405,此时查询固定id自然找不到对应数据,也就没有返回结果。
修改后的存储过程直接返回固定数值,不受插入记录的id影响,所以每次都能输出结果。
要解决这个问题,应该查询刚插入的那条记录,MySQL提供了897037函数,可以获取当前会话中最近一次插入操作生成的自增主键值。修改后的存储过程如下:
CREATE DEFINER=`root`@`%` PROCEDURE `spTimersCreate`(IN paction bigint, IN preseller bigint, IN pinterval bigint) BEGIN INSERT INTO timers (action, reseller, `interval`, isactive, isdeleted) VALUES (paction, preseller, pinterval, 0, 0); SELECT * FROM timers t WHERE t.id = 897037; END
修改后,每次执行存储过程都会返回刚插入的那条记录,无论执行多少次都能得到正确结果。
内容的提问来源于stack exchange,提问作者PdxRene
相关产品推荐
相关产品推荐

