2012-04-05 26 views
0

我完全卡住了這一點,:如何將變量值傳遞給存儲過程在mysql中的全文語句?

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

如果ypu想要將標識符名稱傳遞給過程並在查詢中使用它們,則應該將查詢作爲字符串構建,然後使用預處理語句執行。

SQL Syntax for Prepared Statements

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 
+0

謝謝!這工作。 但有一點薄霧在那裏。 '執行stmt使用@match_against;' – rbgall 2012-04-05 16:19:31

+0

謝謝,我修復了錯字:) – 2012-04-05 16:24:08

+0

如果動態表名不好,我應該如何在多個表中進行搜索請求?我使用php + mysql環境。 – rbgall 2012-04-05 16:43:38

相關問題