2016-03-01 98 views
0

的MySQL 5.6MySQL的存儲過程 - 「你在你的SQL語法錯誤」

CREATE PROCEDURE test() 
BEGIN 
DECLARE _idKeep INT; 
SET _idKeep = 1; 
PREPARE string FROM "UPDATE users set firstname='Joe' where id=?"; 
EXECUTE string USING _idKeep; 
/*SELECT _idKeep;*/ 
END 

錯誤消息:

您的SQL語法錯誤;檢查 對應於你的MySQL服務器版本使用 附近「_idKeep正確的語法手冊;

如果我註釋掉PREPARE和EXECUTE語句,並取消註釋SELECT語句,則錯誤消息將消失。爲什麼會這樣?

回答

1

在查詢中不能使用局部變量,用戶只能定義的變量。

參數值只能由用戶變量提供,並且USING子句必須與語句中參數標記的數目完全相同。

http://dev.mysql.com/doc/refman/5.7/en/execute.html

用戶定義的變量是會話特定的。由一個客戶端定義的用戶變量不能被其他客戶端看到或使用。 (例外:與訪問性能架構user_variables_by_thread表可以看到所有會話的所有用戶變量的用戶)的所有變量對於給定的客戶端會話自動釋放時,該客戶端退出。

http://dev.mysql.com/doc/refman/5.7/en/user-variables.html

因爲局部變量是在只在存儲的程序的執行範圍,對它們的引用不是在所存儲的程序中創建的準備語句允許的。準備報表範圍是當前會話,而不是存儲的程序,所以程序結束後可能要執行的語句,此時變量將不再在範圍內。例如,SELECT ... INTO local_var不能用作預準備語句。這個限制也適用於存儲過程和函數參數。

http://dev.mysql.com/doc/refman/5.7/en/local-variable-scope.html

所存儲的程序中創建的準備語句繼續存在程序執行完畢,並且可以在程序之外以後被執行之後。

在存儲程序上下文準備,因爲他們走出去的程序結束時的範圍,將是不可用的是聲明稍後程序外執行不能引用存儲過程或函數的參數或局部變量的聲明。作爲解決方法,請參閱用戶定義的變量,該變量也具有會話範圍。

http://dev.mysql.com/doc/refman/5.7/en/prepare.html

你可以使用用戶定義的變量,並限制它的版本任何地方,但這個功能。

相關問題