1

我正在处理一个存储过程来更新产品表中的订单字段。它现在唯一的问题是循环中的最后一项(cur),增加了两次而不是一次(所以被称为)。像这样:

+-----------------+
|产品+订单|
|_id | |
| | |
| 1 | 0 |
| 2 | 1 |
| 等等。 | 等等。|
| 36 | 35 |
| 37 | 36 |
| 38 | 38 |
| |
+-----------------+

我不知道为什么。在这种情况下,链接表(CategoryProduct)变为 38,category_id 为 2CALL curorder(2);

存储过程:

DELIMITER //
CREATE PROCEDURE curorder(
    IN catid INT
)
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE i INT DEFAULT 0;
    DECLARE p INT;
    DECLARE cur CURSOR FOR SELECT product_id FROM test.CategoryProduct WHERE category_id = catid;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    OPEN cur;
        read_loop: LOOP
            FETCH cur INTO p;
            UPDATE  `test`.`Product` SET  `order` =  i WHERE  `Product`.`product_id` =p;
            SET i = i + 1;
            IF done THEN
                LEAVE read_loop;
            END IF;
        END LOOP;
    CLOSE cur;
END //
DELIMITER ;

数据库是一个Mysql数据库。任何改进程序的建议总是受欢迎的。

提前致谢。

编辑:

我已经尝试将 SET i STATEMENT 放在 IF 语句下方,但没有结果。

4

1 回答 1

1

你应该把:

IF done THEN
  LEAVE read_loop;
END IF;

在您的更新语句上方,mysql 最后一次遍历循环是使用旧变量,因为没有新的“p”。但我增加了。

我调试存储过程的好方法是使用日志表:

CREATE TABLE procedureLog
(
  id INTEGER AUTO_INCREMENT,
  description TEXT,
  PRIMARY KEY (id)
);

对于这种情况,您可以使用以下查询记录更新参数:

INSERT INTO  `test`.`procedureLog` (`id` ,`description`) VALUES (null,  CONCAT('id: ', CAST(p as CHAR), ' order: ', CAST(i as CHAR)));

祝你好运!

于 2013-04-05T13:27:33.090 回答