我正在尝试在mySQL Workbench中创建一个存储过程。目标是清理/标准化驻留在加载的临时表中的字段。这是代码的片段......许多更新行缺失。
CREATE DEFINER=`root`@`localhost` PROCEDURE `Address`(TBL VARCHAR(50))
BEGIN
SET @table_name = TBL;
UPDATE table_name SET AD1 = REPLACE(AD1,"P.O. BOX ","BOX ");
UPDATE table_name SET AD1 = REPLACE(AD1,"POBOX ","BOX ");
UPDATE table_name SET AD1 = REPLACE(AD1,"P O BOX ","BOX ");
END
问题:该功能无法识别该表。
错误代码:
146' kalo.table_name'不存在
我做错了什么?
答案 0 :(得分:0)
UPDATE table_name SET AD1 = REPLACE(AD1,"P.O. BOX ","BOX ");
^--missing @
即使您记得将@
放在那里,也无法使用vars替换SQL关键字/标识符。您需要使用动态SQL,例如手动构建查询字符串,然后exec
该字符串。没有其他方法可以将@table_name
字符串转换为实际标识符。
答案 1 :(得分:0)
执行此操作的唯一方法是将Query放入变量并将其作为预准备语句
执行CREATE DEFINER=`root`@`localhost` PROCEDURE `Address`(TBL VARCHAR(50))
BEGIN
SET @table_name = TBL;
SELECT CONCAT( "UMDATE ",@table_name, " SET ....") INTO @SQL;
PREPARE stmt FROM @SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- next update
-- ...
END