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

MySQL 8.0存储过程调用报#2014错误:Commands out of sync求助

问题描述

我已查阅Stack Overflow上诸多相关帖子,但未找到解决方案。在共享服务器上,我通过phpMyAdmin为MySQL 8.0 Standard创建了如下存储过程:

DELIMITER //
CREATE PROCEDURE CreateUpdateCarrierRange (
    IN idCarrier INT,
    IN idZone INT,
    IN iWeightMin DECIMAL,
    IN iWeightMax DECIMAL,
    IN price DECIMAL,
    IN display INT
)
BEGIN
    SET @iCount :=  0;
    SELECT @iCount, idCarrier, iWeightMin, iWeightMax;
    -- 该重量区间是否存在?→ count返回值>0即存在
    SELECT @iCount := COUNT(RANGE_WEIGHT.id_carrier)
    FROM range_weight as RANGE_WEIGHT
    WHERE
        RANGE_WEIGHT.id_carrier = idCarrier 
        AND RANGE_WEIGHT.delimiter1 = iWeightMin 
        AND RANGE_WEIGHT.delimiter2 = iWeightMax;
    
    IF display = 1 THEN
        SELECT @iCount as 'Nombre enregistrements range_weight';
    END IF;

END //

DELIMITER ;

在phpMyAdmin中执行以下调用语句:

CALL CreateUpdateCarrierRange(128, 1, 4.000, 5.000, 10.75, 1) 

触发如下错误:

Static Analysis :

1 error found during the analysis

Missing expression. (near "ON" at position 25)
SET FOREIGN_KEY_CHECKS = ON;
#2014 - Commands out of sync; you can't run this command now

相关帖子提到的可能原因包括缺少BEGIN END、分隔符错误、多线程问题等,但我未在自身代码中发现此类问题,特此求助。

执行SHOW CREATE PROCEDURE CreateUpdateCarrierRange;返回结果如下:

Procedure : CreateUpdateCarrierRange
**sql_mode :
Create Procedure : CREATE DEFINER=o13084985@% PROCEDURE CreateUpdateCarrierRange
haracter_set_client : utf8mb4
collation_connection : utf8mb4_unicode_ci
Database Collation : utf8mb4_general_ci 

解决方案

#2014 - Commands out of sync错误在phpMyAdmin调用返回多结果集的存储过程时十分常见。你的存储过程先后生成了3组结果集:

  1. 调试用的SELECT @iCount, idCarrier, iWeightMin, iWeightMax;
  2. 赋值用的SELECT @iCount := COUNT(...)(该语句也会返回结果集)
  3. 当display=1时执行的SELECT @iCount as ...

phpMyAdmin对多结果集的处理存在兼容性问题,静态分析的错误大概率是工具误报。可尝试以下解决方法:

  • 合并结果集,减少查询次数
    把赋值操作改成SET结合子查询的形式,避免额外生成结果集,同时去掉调试用的SELECT语句:

    DELIMITER //
    CREATE PROCEDURE CreateUpdateCarrierRange (
        IN idCarrier INT,
        IN idZone INT,
        IN iWeightMin DECIMAL,
        IN iWeightMax DECIMAL,
        IN price DECIMAL,
        IN display INT
    )
    BEGIN
        -- 用子查询直接赋值,不生成额外结果集
        SET @iCount := (
            SELECT COUNT(id_carrier)
            FROM range_weight
            WHERE
                id_carrier = idCarrier 
                AND delimiter1 = iWeightMin 
                AND delimiter2 = iWeightMax
        );
        
        IF display = 1 THEN
            SELECT @iCount as 'Nombre enregistrements range_weight';
        END IF;
    
    END //
    DELIMITER ;
    
  • 更换客户端测试
    若条件允许,用MySQL原生命令行工具调用存储过程。如果命令行能正常执行,说明问题出在phpMyAdmin的结果集处理逻辑上。

  • 检查存储过程完整性
    从SHOW CREATE PROCEDURE的返回结果看,存储过程定义显示不完整,可能是phpMyAdmin的显示bug。建议重新创建存储过程,确保定义完整。

内容的提问来源于stack exchange,提问作者Dominique Delcourt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:47:27