使用预准备语句和变量

时间:2017-08-09 08:47:15

标签: mysql

我有三个存储过程用于三个不同的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秒

我怎样才能使第二个代码块与第一个代码块相同? 感谢

3 个答案:

答案 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