2017-12-31 27 views
0

1 dbテーブルからいくつかの列を選択する必要がある非常に単純なストアドプロシージャがありますが、「一致しません」構文に関連するエラーが発生します。ここに私の手順です:一致するMySqlストアドプロシージャ

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 ; 

、ここでは、私のテーブルのスクリーンショットは、 enter image description here

である私は、プロシージャをテストするとき、それは私にエラーを与える「#1210 - 一致させるために不正な引数」私は、クエリをテストしてみましたプロシージャのうち、それが動作するので、私は問題がプロシージャ自体のsintaxにあると推測しています。事前に助けてくれてありがとう!

答えて

0

https://dev.mysql.com/doc/refman/5.7/en/fulltext-search.htmlは言う:

検索文字列が、クエリ評価中に一定である文字列値である必要があります。これは、行ごとに異なる可能性があるため、たとえば、表の列を除外します。

私はあなたがAGAINSTの引数として、あなたのストアドプロシージャパラメータDescriptionを使用することはできませんと言って、これを読んでいました。

したがって、手順でこれを行うには、PREPARE/EXECUTEを使用する必要があります。


@Michaelから

再コメント:

良い点だ、私はOPの表には、名前が関数の引数の名前と同じである列を持っていることに気づいていませんでした。あなたはこれがあいまいさを引き起こす可能性が高いことは間違いありません。

このあいまいさを避けるために、プロシージャとパラメータのパラメータに任意の列と異なる名前が付いていることを確認することをお勧めします。

+1

これは、列と変数名のあいまいである可能性が高いと思われます。「description」/「Description」 - MATCH(column)AGAINST(program_variable)のバリエーションが異なります。 MATCH(列)AGAINST(列) 'MATCH(program_variable)AGAINST(プログラム可変)'のいずれも有効ではないことを文書化された制限が行ごとに変更できることを知っています。そして、それはこれらの後者の2つの方法のうちの1つがほぼ確実に解決されていると思いますか? –