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 回答