如何将变量值传递给mysql中的fulltext语句的存储过程?

时间:2012-04-05 11:47:17

标签: mysql stored-procedures full-text-search

我完全坚持了下来:

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',但其他方法都不起作用。

2 个答案:

答案 0 :(得分:0)

如果要将标识符名称传递给过程并在查询中使用它们,那么您应该将查询构建为字符串,然后使用预准备语句执行它。

SQL Syntax for Prepared Statements

答案 1 :(得分: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