某种原因,开始使用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
总结两点:
- 存贮过程命名最好采用一个前置标志标明是存贮过程变量,例如 sp_XXX, 当然这也不一定保证不和数据库字段重复,最好的办法是检查一下使用的表,避免重名;
- Session 变量一定要注意隔离,使用前最好进行一下初始化.
marasun 2021-12-4 BJFWDQ