[英]mysql dynamic query in stored procedure
我正在存儲過程中創建一個動態查詢。 我的存儲過程如下:
CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40),IN w_team VARCHAR(40))
BEGIN
SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team=",w_team);
PREPARE stmt3 FROM @t1;
EXECUTE stmt3;
DEALLOCATE PREPARE stmt3;
END
當我嘗試使用以下調用運行它時:
call test1 ('Test','SPA');
我收到以下錯誤消息:
錯誤代碼:1054。“where 子句”中的“SPA”列未知
我在沒有 where 條件的情況下進行了測試並且它工作正常,但是在 where 條件下它不起作用時,我嘗試將 @ 與變量名稱一起使用,但它仍然不起作用。
謝謝你的幫助。
錯誤代碼:1054。“where 子句”中的“SPA”列未知
當您沒有將輸入字符串括在引號中時會發生這種情況,並且 SQL 引擎嘗試將其標識為被查詢表中的列。 但它失敗了,因為它找不到它。
但是當它找到這樣的列時會發生什么?
當它在列值上找到一些匹配時,它會獲取結果。
顯然,這不是人們所期望的。
如何克服這一點? 將准備好的語句與動態輸入值一起使用。
您可以使用占位符,例如?
在存儲過程中也有關於動態輸入值以與Prepared Statements
一起使用。 當分配給 SQL 表達式或在 SQL 表達式中進行比較時,引擎將處理轉義字符和其他字符串值。
您只需根據需要將過程輸入重新分配給一個或多個會話變量。
您的程序示例:
CREATE PROCEDURE `test1`( IN tab_name VARCHAR(40), IN w_team VARCHAR(40) )
BEGIN
SET @t1 = CONCAT( 'SELECT * FROM ', tab_name, ' where team = ?' ); -- <-- placeholder
SET @w_team := w_team;
PREPARE stmt3 FROM @t1;
EXECUTE stmt3 USING @w_team; -- <-- input for placeholder
DEALLOCATE PREPARE stmt3;
END;
您錯過了將參數w_team
括在WHERE
子句中。
像這樣嘗試:
SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team='",w_team,"'");
說明:
從您的代碼查詢將是這樣的:
SELECT * FROM Test where team=SPA
它將嘗試查找不可用的SPA
列,因此會出現錯誤。
我們將其更改為:
SELECT * FROM Test where team='SPA'
嘗試這個..
CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40),IN w_team VARCHAR(40))
BEGIN
SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team='",w_team,"'");
PREPARE stmt3 FROM @t1;
EXECUTE stmt3;
DEALLOCATE PREPARE stmt3;
END
您缺少w_team
變量周圍的引號..
您應該打印動態構建的語句,以便您可以復制打印的語句並嘗試,以便您可以輕松找到此類問題。
select @t1
將打印動態構建的語句..
您可以使用 CONCAT() MySQL 函數添加動態字段和條件。 我檢查過這工作正常。
DELIMITER $$
/*define procedure name*/
CREATE PROCEDURE getSearchData()
BEGIN
DECLARE conditions varchar(1000);
DECLARE selectField varchar(1000);
DECLARE SQL_QUERY varchar(1000);
/*define default select and condition*/
SET @selectField = 'status,id';
set @conditions = ' where return_flight=0';
SET @SQL_QUERY = CONCAT('SELECT ',@selectField, ' FROM flights ',@conditions);
/* you can add more select fields and conditions according to your requirement */
PREPARE stmt1 FROM @SQL_QUERY ;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END$$
DELIMITER ;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.