2017-08-09 75 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