mysql存储过程从表中设置值

duc*_*cin 3 mysql stored-procedures

我有以下简单的表格:

mysql> select * from version;
+----+---------+
| id | version |
+----+---------+
|  1 | 1       |
+----+---------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

我需要创建一个存储过程,该过程将根据该表的值(确切地说,是该表的唯一行)执行某些操作(或不执行任何操作)。

DELIMITER $$
DROP PROCEDURE IF EXISTS upgrade_version $$
CREATE PROCEDURE upgrade_version(current_version INTEGER, script TEXT)
BEGIN
  DECLARE version INT(11);
  SET version = (SELECT `version` FROM `version` WHERE `id` = 1 LIMIT 1);
  SELECT version;
  IF version = current_version + 1 THEN
    PREPARE upgrade_stmt FROM script;
    EXECUTE upgrade_stmt;
    UPDATE `version` SET `version` = `version` + 1 WHERE `id` = 1;
  ENDIF;
END $$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

在以下范围内调用:

CALL upgrade_version(1,'ALTER TABLE ...');
Run Code Online (Sandbox Code Playgroud)

语法不正确,mysql 返回:

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'script;
    EXECUTE upgrade_stmt;
    UPDATE `version` SET `version` = `version`' at line 7 
Run Code Online (Sandbox Code Playgroud)

怎么了?

Che*_*lla 5

我不明白你为什么选择那个“SELECT 版本”,如果你想选择你必须将它检索到变量中的数据,当你直接在终端上使用它时,该语句工作正常。你确定你的脚本中有 prepare_stmt ......!?可能的解决方法是:

  1. 将变量名称 version 更改为 version_v
  2. 而不是这个:

    SET 版本 = (SELECT versionFROM versionWHERE id= 1 LIMIT 1);
    选择版本;

尝试这个:

SELECT `version` INTO Version_v FROM `version` WHERE `id` = 1 LIMIT 1);
Run Code Online (Sandbox Code Playgroud)