2017-12-31 141 views
0

Ich habe eine sehr einfache gespeicherte Prozedur, die einige Spalten aus 1 db Tabelle auswählen sollte, aber ich bekomme einen Fehler im Zusammenhang mit der "MATCH AGAINST" -Syntax. Hier mein Verfahren ist:MySql gespeicherte Prozedur mit Übereinstimmung gegen

DELIMITER $$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `searchItem`(IN `Importer` VARCHAR(100), IN `Description` TEXT) 
BEGIN 
SELECT model, date_of_production, horsepower, importer, description FROM cars WHERE importer = Importer AND MATCH (description) AGAINST(Description) ORDER BY date_of_production ASC; 
END$$ 
DELIMITER ; 

und hier ist Screenshot von meinem Tisch enter image description here

Wenn ich die Prozedur zu testen es gibt mir eine Fehlermeldung „# 1210 - Falsche Argumente MATCH“ Ich habe die Abfrage getestet aus der Prozedur und es funktioniert, so rate ich das Problem ist in der sintax der Prozedur selbst. Danke für die Hilfe im Voraus!

Antwort

0

https://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html sagt:

Der Suchbegriff muss ein String Wert sein, der bei der Abfrageauswertung konstant ist. Dies schließt beispielsweise eine Tabellenspalte aus, da diese für jede Zeile unterschiedlich sein kann.

Ich würde dies zu sagen, lesen, dass Sie nicht Ihre gespeicherte Prozedur Parameter Description als Argument für AGAINST verwenden können.

Sie müssen also PREPARE/EXECUTE verwenden, um dies in einer Prozedur zu tun.


Re Kommentar von @ Michael:

, dass ein guter Punkt ist, ich hatte nicht bemerkt, dass die Tabelle des OP eine Spalte hat, dessen Name auf den Namen des Funktionsparameter identisch ist. Sie haben Recht, dass dies wahrscheinlich zu Zweideutigkeiten führt.

Es ist immer eine gute Idee, sicherzustellen, dass Parameter für Prozeduren und Parameter eindeutige Namen in jeder Ihrer Spalten haben, um diese Mehrdeutigkeit zu vermeiden.

+1

Ich glaube, das ist eher die Mehrdeutigkeit der Spalten- und Variablennamen, die beide unterschiedlich verkürzte Varianten von 'description' /' Description' sind - 'MATCH (Spalte) AGAINST (program_variable)' ist gültig - der Die dokumentierte Einschränkung bezieht sich auf Dinge, die der Optimierer weiß Zeile für Zeile ändern kann, aber keine Variablen enthält ... aber weder 'MATCH (Spalte) AGAINST (Spalte)' noch 'MATCH (Programmvariable) AGAINST (Programmvariable)' wären gültig und es wird mit ziemlicher Sicherheit einer dieser beiden Wege gelöst, meinst du nicht? –