我有三个存储过程用于三个不同的ERP,几乎完全相同的操作,所以我决定只做一个,并使用参数。一些字段名称根据参数而改变,因此我将它们设置在变量中。然后我使用准备好的语句来使它工作。
不使用预准备语句的工作更新如下:
update lt_erp_barcodes
set barcode_list = concat(',', curr_barcode, barcode_list)
where cod_navision = curr_erp_code;
它会更新当前barcode_list,在列表的开头添加curr_barcode,并添加逗号。 (,curr_barcode,列表的其余部分,)
我使用预处理语句的方法是:
set @erp_code_field_name = "cod_navision";
set @curr_erp_code = '12345';
set @curr_barcode = '123123123';
set @q1 = concat('update lt_erp_barcodes
set barcode_list = (\',\'', @curr_barcode, ' barcode_list)
where ', @erp_code_field_name, ' = ', @curr_erp_code);
prepare update_barcode_list from @q1;
execute update_barcode_list;
但是当我打电话给prepare
时,会出现以下错误:
0 228 10:30:17从@ q1准备update_barcode_list错误代码:1064。您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在'123123123 barcode_list附近使用正确的语法 其中cod_navision = 12345'在第2行0.047秒
我怎样才能使第二个代码块与第一个代码块相同? 感谢
答案 0 :(得分:1)
您的代码在@ Q1变量中生成非合法SQL:
DELIMITER $
DROP PROCEDURE IF EXISTS procTest$
CREATE PROCEDURE procTest()
BEGIN
set @erp_code_field_name := "cod_navision";
set @curr_erp_code := '12345';
set @curr_barcode := '123123123';
set @q1 := concat('update lt_erp_barcodes
set barcode_list = (\',\'', @curr_barcode, ' barcode_list)
where ', @erp_code_field_name, ' = ', @curr_erp_code);
SELECT @q1;
prepare update_barcode_list from @q1;
execute update_barcode_list;
END$
DELIMITER ;
CALL procTest();
在此处查看结果:
update lt_erp_barcodes
set barcode_list = (','123123123 barcode_list)
where cod_navision = 12345
您要实现的实际结果是什么?如果您仍然无法解决此问题,请与我们联系,
詹姆斯
答案 1 :(得分:0)
您可能需要从@ q1
中删除'barcode_list'set @q1 = concat('update lt_erp_barcodes
set barcode_list = (\',\'', @curr_barcode, ') where ',
@erp_code_field_name, ' = ', @curr_erp_code);
无论如何,你应该改变它,因为@Phylogenesis在评论中告诉你。
答案 2 :(得分:0)
感谢您的所有答案。我终于实现了如下:
set @q1 = concat('update lt_main_barcodes_v2
set barcode_list = concat(\',', @curr_barcode, '\', barcode_list)
where ', @erp_code_field_name, ' = ', @curr_erp_code);
我更正了语法错误(感谢James)并添加了另一个concat()。现在,MySQL了解barcode_list是一个字段。选择@ q1将带来以下输出:
update lt_erp_barcodes
set barcode_list = concat(',123123123', barcode_list)
where cod_navision = 12345