MySQL中IN参数特性存疑:为何存储过程内修改后原值变化?
MySQL存储过程IN参数的传值语义误区
你对IN参数的理解没错——MySQL里的IN参数确实是传值调用,存储过程内部修改参数值不会影响外部的原始变量。但你的测试方法有问题,导致误解了结果:
你调用存储过程时传的是字面量1,不是一个外部变量。此时存储过程内部的myParameter只是这个字面量的副本,你看到的ModifiedValue=2只是副本的变化,外部根本没有对应的变量会被修改,自然不存在“原参数值从1变为2”的情况。
要验证IN参数的传值特性,应该用外部变量来测试:
-- 定义外部变量并赋值 SET @external_var = 1; -- 查看调用前变量值 SELECT @external_var AS '调用前变量值'; -- 调用存储过程,传入外部变量 CALL MyProcedure(@external_var); -- 查看调用后变量值,确认未被修改 SELECT @external_var AS '调用后变量值';
运行这段代码会发现:调用前后@external_var的值始终是1,只有存储过程内部的myParameter副本被改成了2,这才符合IN参数“原始值保留”的特性。
总结一下:
- IN参数的修改仅作用于存储过程内部的副本,不会影响外部传入的变量
- 直接传字面量时,不存在“外部原始值”,所以看不到保留效果,需要用外部变量测试
内容的提问来源于stack exchange,提问作者Satish Ryali
相关产品推荐
相关产品推荐

