core-moran
Goto Top

Variablen als SQL Query in MySQL

Nutzung des Inhaltes einer Variable als Teil eines Querys in MySQL.

Hallo,

ich möchte in MySQL eine Funktion erstellen, mit deren Hilfe ich Elemente zu einer Tabelle hinzufügen kann.
Das funktioniert sehr gut, ist nur futchtbar langsam bei vielen Elementen.

Deswegen hab ich mir überlegt, einen Puffer zu erzeugen (Session Variable) und diesen dann in einem Rutsch und in
einem Query hinzuzufügen, da das Ganze mindestens um den Faktor 1000 schneller ist.

Folgende 2 Funktionen habe ich hierfür implementiert.

1. Ein Element mit 2 Werten dem Puffer (einem String in dem ein Tel des finalen Queries aufgebaut wird) hinzufügen
2. Den Puffer als Query ausführen

Leider scheint MySQL die Session-Variable in der Flush-Funktion nicht korrekt auszuwerten.
Weiß jemand wie ich MySQL überreden kann, den Inhalt der Variable @element_buffer als Teil des Querys zu interpretieren?

Der Fehlercode ist, dass die Anzahl der einzufügenden Spalten nicht mit den ausgewählten übereinstimmt.

Vielen Dank,
Eric


CREATE PROCEDURE `add_element_to_buffer`(
     ELEMENT_VALUE_1 INT,
     ELEMENT_VALUE_2 INT)
BEGIN
    -- add needed commas to separate the elements in the string
    IF @ELEMENT_BUFFER <> "" THEN  
        SET @ELEMENT_BUFFER = CONCAT_WS("", @ELEMENT_BUFFER, ", ");  
    END IF;
    
    -- add element to the buffer string 
    -- in the format: "(value_1, value_2)"  
    SET @ELEMENT_BUFFER = CONCAT_WS("", @ELEMENT_BUFFER, "(",   
                                        ELEMENT_VALUE_1, ",",  
                                        ELEMENT_VALUE_2, ")" );  
    
END
$$


CREATE PROCEDURE `flush_element_buffer`()
BEGIN
    -- add the elements from the buffer
    
    INSERT INTO `elemt_element` (
        `elemt_value_1`,
        `elemt_value_2`)
    VALUES (
        @ELEMENT_BUFFER     -- <=== Hier ist das Problem
    );
    
    -- clear the buffer
    SET @ELEMENT_BUFFER = "";  
    
END
$$

Content-Key: 159810

Url: https://administrator.de/contentid/159810

Printed on: April 25, 2024 at 08:04 o'clock

Member: core-moran
core-moran Jan 31, 2011 at 14:27:55 (UTC)
Goto Top
Hallo,

mit einer Änderung in der Flush Funktion funktioniert es:

CREATE PROCEDURE `flush_element_buffer`()
BEGIN
      
    set @qry = CONCAT('INSERT INTO `elemt_element` ',  
                      '(`elemt_value_1`, `elemt_value_2`) ',  
                      'VALUES ',  
                      @ELEMENT_BUFFER, ';');  

    -- prepare the statement
    PREPARE myStatement FROM @qry;
    
    -- execute statement
    EXECUTE myStatement;
    
    -- clear the buffer
    SET @ELEMENT_BUFFER = '';  
    
END