【问题标题】:mysql stored procedure set value from tablemysql存储过程从表中设置值
【发布时间】:2012-12-05 14:17:17
【问题描述】:

我有一个如下的简单表格:

mysql> select * from version;
+----+---------+
| id | version |
+----+---------+
|  1 | 1       |
+----+---------+
1 row in set (0.00 sec)

我需要创建一个存储过程,它会根据该表的值(准确地说,该表的唯一行)做某事(或什么都不做)。

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 ;

在以下时间内被调用:

CALL upgrade_version(1,'ALTER TABLE ...');

语法错误,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 

怎么了?

【问题讨论】:

  • 您在过程定义或尝试调用时收到此消息?
  • 定义过程时出现此错误。

标签: mysql stored-procedures


【解决方案1】:

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

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

    SET 版本 = (SELECT version FROM version WHERE id = 1 LIMIT 1);
    选择版本;

试试这个:

SELECT `version` INTO Version_v FROM `version` WHERE `id` = 1 LIMIT 1);

【讨论】:

    【解决方案2】:

    试试这个:

    DELIMITER $$
    DROP PROCEDURE IF EXISTS upgrade_version $$
    CREATE PROCEDURE upgrade_version(current_version INT, script TEXT)
    BEGIN
      SELECT `version` into @ver FROM `version` WHERE `id` = 1 LIMIT 1;  
      SET @s = script;
      IF @ver = current_version + 1 THEN
        PREPARE upgrade_stmt FROM @s;
        EXECUTE upgrade_stmt;
        DEALLOCATE PREPARE upgrade_stmt;
        UPDATE `version` SET `version` = `version` + 1 WHERE `id` = 1;
      END IF;
    END $$
    DELIMITER ;
    

    【讨论】:

      【解决方案3】:

      设置值声明变量

             DELIMITER $$
             create procedure Testing()
                 begin
                  declare Regione int;   
                  set Regione=(select  id from users
                  where id=1) ;
                  select Regione ;
                 end $$
               DELIMITER;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-25
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        • 2020-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多