【问题标题】:Mysql - How to use user defined variables on pointersMysql - 如何在指针上使用用户定义的变量
【发布时间】:2013-12-27 15:24:26
【问题描述】:

我是 InnoDB 的新手,从事务开始。我已经 24 小时试图让它工作。 我正在创建一个交换站点,并且确实需要进行交易。先做一个Select,找一些数据,然后根据给出的结果进行一些更新和插入。

我不会发布完整的查询,因为阅读起来可能非常复杂,所以我创建了一个新查询来指出问题所在。

表日志

    CREATE TABLE `log` (
      `num_rows` int(10) unsigned NOT NULL,
      `new_value` int(10) unsigned NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

存储过程

    DROP PROCEDURE IF EXISTS `test`//

    CREATE PROCEDURE `test` (IN var1 BIGINT) 
    BEGIN
      DECLARE done INT DEFAULT 0;
      DECLARE result INT;
      DECLARE num_rows INT;

      DECLARE cur1 CURSOR FOR
        SELECT @var1 := @var1 +1 AS result;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

      START TRANSACTION;
        OPEN cur1;
        SELECT FOUND_ROWS() into num_rows;
        INSERT INTO log (num_rows,new_value) VALUES (num_rows,var1);

        read_loop:
        LOOP
          FETCH cur1 INTO result;
          IF done = 1 THEN
              LEAVE read_loop;
          END IF;
        END LOOP read_loop;

        CLOSE cur1;
      COMMIT;
    END//

当我尝试时

    CALL test(1);

我将 1 作为 var1 参数传递。所以在cur1中,应该增加值。然后用新值在日志中插入一个新行。看起来 := 分配不起作用。

其实我变了

    SELECT @var1 := @var1 +1 AS result;

为此

    SELECT var1 := var1 +1 AS result;

在 ":= var1 +1" 上得到一个错误

【问题讨论】:

标签: mysql variables pointers stored-procedures transactions


【解决方案1】:

我知道问题的代码是存储过程实际代码的抽象,所以不太明白你需要做什么,但是,这样的代码可能会有所帮助。

/* Procedure structure for procedure `test` */

/*!50003 DROP PROCEDURE IF EXISTS  `test` */;

DELIMITER $$

CREATE PROCEDURE `test`(IN `var1` BIGINT)
BEGIN
    DECLARE `done` TINYINT(1) DEFAULT 0;
    DECLARE `result` BIGINT;
    DECLARE `_num_rows` INT;
    DECLARE `cur1` CURSOR FOR
        SELECT SQL_CALC_FOUND_ROWS @`var1` := `var1` + 1;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET `done` := 1;
    START TRANSACTION;
    OPEN `cur1`;
    SET `var1` := @`var1`;
    SELECT FOUND_ROWS() INTO `_num_rows`;
    INSERT INTO `log` (`num_rows`, `new_value`) VALUES (`_num_rows`, `var1`);
    `read_loop`: LOOP
      FETCH `cur1` INTO `result`;
      IF (`done`) THEN
          LEAVE `read_loop`;
      END IF;
    END LOOP `read_loop`;
    CLOSE `cur1`;
    COMMIT;
END$$

DELIMITER ;

重要的是指出9.4. User-Defined Variables和例程参数13.1.15. CREATE PROCEDURE and CREATE FUNCTION Syntax之间的区别是不同的变量。

SQL Fiddle demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2020-12-24
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多