MySQL 存贮过程变量命名和数据库字段不能重名

某种原因,开始使用MySql存贮过程.记录一个令人困惑的错误如下:
单独调试正确,调用存贮过程就错.
举例如下:

-- Return the value  by inex from json array  whose key is val , [{"val",1},{"val",2}]
delimiter $$
 drop procedure if exists sp_1
create procedure  sp_1(out pkArr json )  
begin
    -- For exception  
    -- Declare exception handler for failed insert
	DECLARE code CHAR(5) DEFAULT '0';
   set @APP_CODE ="C001";
   SELECT `value` into  @Time_Unit_A FROM app_config  where `code` =@APP_CODE AND `key` = "Time_Unit_A";
   
	set	pkArr = retJson;
end $$
delimiter ;

代码中的select 语句单独调试没有任何问题,一旦调用这个存贮过程就不对,经过仔细甄别和思考, 发现

DECLARE code CHAR(5) DEFAULT ‘0’;

这个定义的坑. 这个code 和 表中的字段同名, 因此使用时发生了歧义. 导致结果为空.

还有个坑就是@ 这种变量相当于是全局变量,在整个session 中都有效,即 存贮过程和函数体不能隔离这些变量值!

解决办法, 将上面的code 改个名字即可. 例如 ex_code

总结两点:

  1. 存贮过程命名最好采用一个前置标志标明是存贮过程变量,例如 sp_XXX, 当然这也不一定保证不和数据库字段重复,最好的办法是检查一下使用的表,避免重名;
  2. Session 变量一定要注意隔离,使用前最好进行一下初始化.

marasun 2021-12-4 BJFWDQ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值