【问题标题】:MySQL stored procedures - "You have an error in your SQL syntax"MySQL 存储过程 - “您的 SQL 语法有错误”
【发布时间】:2016-06-13 08:22:40
【问题描述】:

MySQL 5.6

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 语句,那么错误消息就会消失。为什么会这样?

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

    您不能在查询中使用局部变量,只能使用用户定义的变量。

    参数值只能由用户变量提供,并且 USING 子句必须命名与语句中参数标记的数量一样多的变量。

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

    用户定义的变量是特定于会话的。一个客户端定义的用户变量不能被其他客户端看到或使用。 (例外:有权访问 Performance Schema 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

    在存储程序中创建的prepared statement在程序执行完毕后继续存在,以后可以在程序外执行。

    在存储程序上下文中准备的语句不能引用存储过程或函数参数或局部变量,因为它们在程序结束时超出范围,并且如果稍后在程序之外执行该语句,它们将不可用。作为一种解决方法,请改用用户定义的变量,这些变量也具有会话范围。

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

    您可以在除此函数之外的任何地方使用用户定义的变量并限制其版本。

    【讨论】:

      猜你喜欢
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多