我完全坚持了下来:
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',但其他方法都不起作用。
答案 0 :(得分:0)
如果要将标识符名称传递给过程并在查询中使用它们,那么您应该将查询构建为字符串,然后使用预准备语句执行它。
答案 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