调用MySQL存储过程出现Error Code:1222错误,寻求解决方案
解决MySQL存储过程的1222错误:SELECT语句列数不匹配
错误原因分析
你遇到的Error Code: 1222问题核心非常清晰:你的SELECT语句返回了2列数据,但INTO子句仅指定了1个变量来接收结果。
看你存储过程里的关键代码:
SELECT numpieza, count(numvend) into nvend from preciosum where numpieza like _piez;
这里SELECT同时查询了numpieza字段和聚合函数count(numvend),相当于返回两个结果列,但into nvend只给了一个变量nvend来接收数据——MySQL没办法把两列结果塞进一个变量里,所以直接抛出了「列数不匹配」的错误。
解决办法
根据你的调用逻辑(输出指定零件对应的供应商数量),你只需要保留聚合函数的结果即可,去掉多余的numpieza查询:
修改后的完整存储过程代码:
delimiter / drop procedure if exists piez_vend;/ create procedure piez_vend (IN _piez varchar(20), out nvend int(11)) begin -- 仅查询count结果,与INTO的变量数量完全匹配 SELECT count(numvend) into nvend from preciosum where numpieza like _piez; end / delimiter ;
如果你确实需要同时获取numpieza的值,那就要给存储过程新增一个输出变量来接收该字段,示例如下:
delimiter / drop procedure if exists piez_vend;/ create procedure piez_vend (IN _piez varchar(20), out pieza varchar(20), out nvend int(11)) begin SELECT numpieza, count(numvend) into pieza, nvend from preciosum where numpieza like _piez; end / delimiter ; -- 调用时需要传入两个输出变量 call piez_vend('dd-0001-210',@pieza,@nvend);
验证效果
用你提供的示例数据测试,调用call piez_vend('dd-0001-210',@nvend);后,@nvend会返回1,符合该零件仅一条供应商记录的实际情况。
内容的提问来源于stack exchange,提问作者Carmelo Ricarte Rocamora
相关产品推荐
相关产品推荐

