MySQL存储过程执行返回Null值问题求助
问题分析与解决
你的存储过程调用后返回Null的核心原因是内部局部变量与输出参数重名,导致输出参数未被正常赋值。
错误根源
在存储过程的begin块中,你声明了和输出参数同名的局部变量:
declare countFD, countSA int default 0;
MySQL中局部变量优先级高于同名的输出参数,后续的select ... into countFD和select ... into countSA实际是给局部变量赋值,而非存储过程头部定义的输出参数。外部传入的@SA、@FD自然接收不到数据,最终返回Null。
修正后的存储过程
移除内部的局部变量声明,直接操作输出参数即可:
delimiter $$ CREATE procedure sp_count_accounts(in inCX varchar(45), out countFD int, out countSA int) begin select count(*) into countFD from account where ACC_TYPE='FD' and CUS_NAME = inCX; select count(*) into countSA from account where ACC_TYPE='SA' and CUS_NAME = inCX; end $$ delimiter ;
调用验证
执行原调用语句:
CALL sp_count_accounts('Alex', @SA, @FD); SELECT @SA as Savings, @FD as 'Fixed Deposit';
此时输出参数会被正确赋值,返回结果符合预期:
Savings Fixed Deposit 1 2
可选优化(提升查询效率)
可以用一次查询同时统计两种账户类型,减少数据库访问次数:
delimiter $$ CREATE procedure sp_count_accounts(in inCX varchar(45), out countFD int, out countSA int) begin select sum(case when ACC_TYPE='FD' then 1 else 0 end) into countFD, sum(case when ACC_TYPE='SA' then 1 else 0 end) into countSA from account where CUS_NAME = inCX; end $$ delimiter ;
内容的提问来源于stack exchange,提问作者WANG GUANG LIANG VINCENT _
相关产品推荐
相关产品推荐

