2016-03-01 97 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

你可以使用用户定义的变量,并限制它的版本任何地方,但这个功能。