执行MySQL存储过程时报错‘Unknown system variable 'store'’求助
解决存储过程报错“Unknown system variable 'store'”的问题
首先,你碰到的这个错误核心原因很明确:你在存储过程里使用了store变量,但没有提前声明它。MySQL会把未声明的变量当作系统变量来查找,自然找不到名为store的系统变量,所以抛出这个错误。
除此之外,你的存储过程还有几个语法和逻辑上的小问题,我帮你逐一修正并解释:
主要问题与修正点
- 缺少局部变量声明:
store、oldDomain、newDomain这些自定义变量都需要用DECLARE声明对应的类型 - DELIMITER使用错误:DELIMITER需要指定一个临时分隔符(比如
//),执行完存储过程后要恢复回默认的; - 字符串拼接运算符错误:MySQL里字符串拼接要用
CONCAT()函数,而不是+(+是算术运算符) - 长度函数错误:MySQL没有
LEN()函数,应该用LENGTH()来获取字符串长度 - 循环逻辑错误:
SUBSTRING_INDEX返回的是截取后的字符串,不是位置索引,之前的循环条件和变量赋值逻辑搞反了 - 语法遗漏:
END IF语句末尾必须加分号,还有CONCAT里的字符串和变量之间漏了逗号
修正后的完整存储过程
DELIMITER // CREATE PROCEDURE `replace_release_to_test_db`( IN baseUrl VARCHAR(255), IN substituteDomain VARCHAR(255), IN storeList VARCHAR(255) ) BEGIN DECLARE pos INT; DECLARE store VARCHAR(255); DECLARE oldDomain VARCHAR(255); DECLARE newDomain VARCHAR(255); DECLARE tempStoreList VARCHAR(255); -- 初始化临时变量,处理输入的店铺列表,末尾加逗号确保最后一个店铺能被处理 SET tempStoreList = CONCAT(LTRIM(RTRIM(storeList)), ','); WHILE tempStoreList <> '' DO -- 获取第一个逗号前的店铺名 SET store = SUBSTRING_INDEX(tempStoreList, ',', 1); IF store <> '' THEN SET oldDomain = CONCAT(store, ".", baseUrl); SET newDomain = CONCAT(substituteDomain, "-", store, ".", baseUrl); UPDATE core_config_data SET value = REPLACE(value, oldDomain, newDomain); END IF; -- 截断已经处理过的店铺名部分 SET tempStoreList = SUBSTRING(tempStoreList, LENGTH(store) + 2); END WHILE; -- 处理不带店铺前缀的域名替换 UPDATE core_config_data SET value = REPLACE(value, CONCAT("http://", baseUrl), CONCAT("http://", substituteDomain, ".", baseUrl)); UPDATE core_config_data SET value = REPLACE(value, CONCAT("https://", baseUrl), CONCAT("https://", substituteDomain, ".", baseUrl)); -- 查询验证结果 SELECT * FROM core_config_data WHERE value LIKE '%abc.kr%'; END // DELIMITER ; -- 调用存储过程 CALL replace_release_to_test_db("abc.kr","test", "my,sg,ph,id,th,us,my-mobile,sg-mobile,ph-mobile,id-mobile,th-mobile,us-mobile");
补充说明
我把原来的storeList换成了tempStoreList作为临时变量,避免修改输入参数;同时调整了循环逻辑,通过不断截断已处理的部分来终止循环,逻辑更清晰也更可靠。
现在你可以执行这个修正后的存储过程,应该就能正常完成从生产库到测试库的域名替换操作了。
内容的提问来源于stack exchange,提问作者Jin Ho So
相关产品推荐
相关产品推荐

