Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql dynamische Abfrage in gespeicherter Prozedur

Fehlercode:1054. Unbekannte Spalte „SPA“ in „Where-Klausel“

Dies geschieht, wenn Sie die Eingabezeichenfolge nicht in Anführungszeichen setzen und die SQL-Engine versucht, sie als Spalte in der abgefragten Tabelle zu identifizieren. Aber es schlägt fehl, da es es nicht finden kann.

Aber was passiert, wenn es eine solche Spalte findet?
Es ruft Ergebnisse ab, wenn es einige Übereinstimmungen mit den Spaltenwerten findet.
Offensichtlich war das nicht das, was man erwartet hatte.

Wie kann man das überwinden? Verwenden Sie vorbereitete Anweisungen mit dynamischen Eingabewerten.

Sie können Platzhalter wie ? verwenden auch in Stored Procedures auf dynamische Eingabewerte zur Verwendung mit Prepared Statements . Die Engine verarbeitet Escape-Zeichen und andere Zeichenfolgenwerte, wenn sie SQL-Ausdrücken zugewiesen oder innerhalb dieser verglichen werden.

Sie müssen lediglich Prozedureingaben nach Bedarf einer oder mehreren Sitzungsvariablen neu zuweisen.

Beispiel für Ihr Verfahren :

CREATE PROCEDURE `test1`( IN tab_name VARCHAR(40), IN w_team VARCHAR(40) )
BEGIN
  SET @t1 = CONCAT( 'SELECT * FROM ', tab_name, ' where team = ?' ); -- <-- placeholder
  SET @w_team := w_team;

  PREPARE stmt3 FROM @t1;
  EXECUTE stmt3 USING @w_team; -- <-- input for placeholder
  DEALLOCATE PREPARE stmt3;
END;