【问题标题】:SQL cursor & stored procedure order arrangementSQL游标和存储过程顺序排列
【发布时间】:2013-04-05 12:22:09
【问题描述】:

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

+-----------------+ |产品+订单| |_id | | | | | | 1 | 0 | | 2 | 1 | |等等。 |等等。| | 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 语句下方,但没有结果。

【问题讨论】:

    标签: mysql sql stored-procedures cursor


    【解决方案1】:

    你应该输入:

    IF done THEN
      LEAVE read_loop;
    END IF;
    

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

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

    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)));
    

    祝你好运!

    【讨论】:

    • 感谢它的工作!辉煌。下次生病尝试用这样的查询来调试它;)聪明的想法
    猜你喜欢
    • 2018-12-08
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    相关资源
    最近更新 更多