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组结果集:
- 调试用的
SELECT @iCount, idCarrier, iWeightMin, iWeightMax; - 赋值用的
SELECT @iCount := COUNT(...)(该语句也会返回结果集) - 当
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

