SQL游标&存储过程订单安排

时间:2013-04-05 12:22:10

标签: mysql sql stored-procedures cursor

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

+-----------------+
|product + order  |
|_id     |        |
|        |        |
|  1     |   0    |
|  2     |   1    |
|  etc.. |   etc..|
|  36    |   35   |
|  37    |   36   |
|  38    |   38   |
|                 |
+-----------------+

我无法弄清楚原因。在这种情况下,链接表(CategoryProduct)变为38,category_id为2 CALL 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 STATEMENT下面但没有结果。

1 个答案:

答案 0 :(得分: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)));
祝你好运!