簡體   English   中英

存儲過程中的mysql動態查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM