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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:35:04