我正在处理存储过程以更新产品表中的订单字段。 它现在只有问题是循环中的最后一项(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下面但没有结果。
答案 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)));
祝你好运!