1

如何在MySQL數據庫中使用動態SQL語句而不使用會話變量?帶本地變量的動態MySQL

現在我有這樣的代碼(在MySQL存儲過程):

(...) 
DECLARE TableName VARCHAR(32); 
SET @SelectedId = NULL; 
SET @s := CONCAT("SELECT Id INTO @SelectedId FROM ", TableName, " WHERE param=val LIMIT 1"); 
PREPARE stmt FROM @s; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
IF ISNULL(@SelectedId) THEN 
(...)

但我想只使用局部變量,這意味着我想與啓動該程序:

DECLARE TableName VARCHAR(32); 
DECLARE s VARCHAR(1024); 
DECLARE SelectedId INTEGER UNSIGNED; 
(...)

並且不要在任何地方使用@ char。有沒有辦法做到這一點?

回答

1

對不起,MySQL中的預處理語句是會話全局的。根據http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html,「準備好的聲明對於本次會議來說也是全球性的。」

在MySQL 5.x中執行動態SQL沒有其他方法(除了預準備語句)。

所以,你當然可以替換上面的「@s」,但AFAIK你堅持@SelectedId。

在MySQL 6.x中,有一項功能計劃將添加一個將執行動態SQL的「EXECUTE IMMEDIATE」語句。見http://forge.mysql.com/worklog/task.php?id=2793