2017-08-09 2 views
0

Ich habe drei gespeicherte Prozeduren für drei verschiedene ERPs, die fast genau die gleichen Operationen machen, also entschied ich mich, nur einen zu machen und Parameter zu verwenden. Einige der Feldnamen ändern sich abhängig von den Parametern, daher setze ich sie in Variablen. Dann verwende ich vorbereitete Anweisungen, damit es funktioniert.SQL-Syntaxfehler mit vorbereiteten Anweisungen und Variablen

Eine Arbeits Update, das nicht vorbereitete Anweisungen nicht verwendet ist wie folgt:

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

Es aktualisiert die aktuelle barcode_list sich am Anfang der Liste hinzugefügt curr_barcode, und auch das Hinzufügen ein Komma. (, Curr_barcode, der Rest der Liste)

Mein Ansatz, um es mit vorbereiteter Aussage zu machen Arbeit ist:

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; 

Aber wenn ich zu prepare rufe die folgenden Fehler ausgelöst:

0 228 10:30:17 Vorbereitung update_barcode_list von @ q1 Fehlercode: 1064. Sie haben einen Fehler in Ihrer SQL-Syntax; Sie in die Bedienungsanleitung zu Ihrer MySQL-Server-Version für die richtige Syntax entspricht in der Nähe zu verwenden ‚123123123 barcode_list wo cod_navision = 12345‘ in Zeile 2 0,047 sec

Wie kann ich den zweiten Block von Code Arbeit des gleiches machen wie der erste? Dank

+1

Können Sie die generierte SQL-Anweisung drucken? – mcalex

+0

Eigentlich können Sie doppelte Anführungszeichen anstatt einfache Anführungszeichen um die Zeichenfolge verwenden, wenn Sie ein einfaches Anführungszeichen benötigen, d. H. Concat ("'", @ variable, "'"); so ähnlich. – Learning

+0

Ich denke, Sie sind ein wenig verwirrt darüber, wie vorbereitete Anweisungen funktionieren sollen (und wie sie Sie vor der SQL-Injektion schützen). Am Ende bedeutet die Art, wie du es versuchst *, dass du keinen Schutz hinzugefügt hast. Sie verketten SQL-Abfragen immer noch zusammen. – Phylogenesis

Antwort

0

Sie müssen die ‚barcode_list‘ aus dem @ q1

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

Wie auch immer ausziehen, sollten Sie es ändern, wie @Phylogenesis Sie in seinem Kommentar erzählt.

1

Ihr Code erzeugt nicht legal SQL in dem @ Q1 Variable:

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(); 

das Ergebnis Siehe hier:

update lt_erp_barcodes 
         set barcode_list = (','123123123 barcode_list) 
         where cod_navision = 12345 

Was ist das eigentliche Ergebnis, das Sie erreichen wollen? Lassen Sie mich wissen, wenn Sie noch nicht lösen können,

James

0

Vielen Dank für Ihre Antworten. Ich erreichte es schließlich wie folgt:

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

I Syntaxfehler (Dank James) korrigiert und fügte einen weiteren concat(). Jetzt weiß MySQL, dass barcode_list ein Feld ist. Die Auswahl von @ q1 ergibt die folgende Ausgabe:

update lt_erp_barcodes 
set barcode_list = concat(',123123123', barcode_list) 
where cod_navision = 12345 
Verwandte Themen