为何调用两次MySQL存储过程后用户变量@x结果为3?
MySQL用户变量导致结果递增的原因
核心原因是以@开头的MySQL用户变量是会话级的——只要当前数据库连接没断,它的值就会一直保留,不会自动重置。
咱们一步步拆解你的代码执行流程:
- 先执行
SET @x = 1;,此时变量@x的值为1。 - 第一次调用
CALL uservariable();:
存储过程里执行SET @x = @x + 1;,@x从1变为2,随后SELECT输出2。 - 第二次调用
CALL uservariable();:
此时@x仍保留着上一次的结果2,执行加法后变为3,SELECT输出3。
你以为会得到2,应该是只考虑了第一次调用的结果,但你连续调用了两次存储过程,第二次是在第一次的结果基础上继续累加,所以最终输出3。
至于“再次运行时结果每次递增1”,是因为只要当前数据库会话没断开,@x会一直保留最后一次的计算结果。比如你再调用一次存储过程,它会在3的基础上再加1变成4。如果想每次都从1开始计算,需要每次调用前重新执行SET @x = 1;。
如果不想让变量保留值,还可以使用存储过程的局部变量(用DECLARE声明),这类变量只在存储过程执行期间存在,执行完毕就会销毁,不会遗留上次的结果。
内容的提问来源于stack exchange,提问作者Newprogrammer
相关产品推荐
相关产品推荐

