2017-08-09 91 views
0

我有三个不同的ERP的三个存储过程,几乎完全相同的操作,所以我决定只做一个,并使用参数。一些字段名称根据参数而改变,所以我将它们设置为变量。然后我使用准备好的语句使其工作。使用准备好的语句和变量的SQL语法错误

不使用预处理语句

的工作更新如下:

update lt_erp_barcodes 
set barcode_list = concat(',', curr_barcode, barcode_list) 
where cod_navision = curr_erp_code; 

它更新当前barcode_list在列表的beggining添加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秒

我怎么可能使代码工作的第二块一样第一个? 感谢

+1

您能打印生成的sql语句吗? – mcalex

+0

其实你可以在字符串周围使用双引号而不是单引号,如果你需要它有单引号即concat(“'”,@ variable,“'”);类似的东西。 – Learning

+0

我认为你对准备语句应该如何工作(以及它们如何保护你免受SQL注入)有点困惑。最后,你试图这样做的方式意味着你没有添加任何保护。您仍然只是将SQL查询连接在一起。 – Phylogenesis

回答

0

您可能需要脱掉“barcode_list”从你的@ Q1

set @q1 = concat('update lt_erp_barcodes 
        set barcode_list = (\',\'', @curr_barcode, ') where ', 
        @erp_code_field_name, ' = ', @curr_erp_code); 

无论如何,你应该改变它作为@Phylogenesis告诉你它的评论。

1

您的代码生成不合法的SQL在@ Q1变量:

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 

什么是你想达到的实际结果如何呢?让我知道,如果你仍然无法解决这个问题,

詹姆斯

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