0

私はこれを完全に立ち往生しています:

SET @req='sometingToFind'
SELECT COUNT(id) FROM mytable WHERE MATCH(descr) AGAINST(@req IN BOOLEAN MODE);

これはうまくいきますが、次のように宣言するストアドプロシージャに同じことをすると:

CREATE PROCEDURE `search_proc`(tn VARCHAR(32), r VARCHAR(60))
BEGIN
SELECT COUNT(id) FROM tn WHERE MATCH(descr) AGAINST(r IN BOOLEAN MODE);
END

そしてそれを実行します:

SET @req='sometingToFind'
CALL search_proc('mytable','@req');

引用符を誤って解釈するエラーが発生しました。

> ERROR 1146 (42S02): Table 'mybase.tn' doesn't exist

ストアドプロシージャなどでr「r」に置き換えてさまざまな代替手段を試しましたが、これらはすべて機能しませんでした。

4

2 に答える 2

0

ypuが識別子名をプロシージャに渡し、それらをクエリで使用する場合は、クエリを文字列として作成し、プリペアドステートメントを使用して実行する必要があります。

プリペアドステートメントのSQL構文

于 2012-04-05T11:52:50.980 に答える
0

動的テーブル名の問題が再び発生します。私は個人的には、プロシージャーで動的テーブル名を使用することを好みませんし、承認もしませ

次に、その方法について説明します。ストアド プロシージャで準備済みステートメントを作成し、それを実行する必要があります。これにより、テーブル名が引用されて間違って解釈されるのを防ぐことができます。

CREATE PROCEDURE `search_proc`(tn VARCHAR(32), r VARCHAR(60))
BEGIN

SET @dynamic_sql = CONCAT('SELECT COUNT(id) FROM ', tn, ' WHERE MATCH(descr) AGAINST(? IN BOOLEAN MODE);');
SET @match_against = r;

PREPARE stmt FROM @dynamic_sql;
EXECUTE stmt USING @match_against;
DEALLOCATE PREPARE stmt;

END
于 2012-04-05T11:58:19.200 に答える