2013-04-05 2 views
1

Я работал над хранимой процедурой, чтобы обновить поле заказа в таблице продуктов. Это работает только проблема теперь последний элемент в цикле (cur), увеличивается дважды вместо одного раза (так dubbeled). Нравится так:Порядок заказа SQL и порядок хранения хранимых процедур

+-----------------+ 
|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. Любые предложения по улучшению процедуры всегда приветствуются.

Заранее спасибо.

EDIT:

я уже пытался поставить SET I ЗАЯВЛЕНИЕ под IF ЗАЯВЛЕНИЕ, но без результата.

ответ

1

Вы должны поставить:

IF done THEN 
    LEAVE read_loop; 
END IF; 

Над выписке обновления, последний раз, когда MySQL идет корыта цикл использует старые переменные, потому что нет никакой новой «р». но 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))); 

Удачи!

+0

Спасибо, что работает !! briljant. В следующий раз я пытаюсь отлаживать его с такими запросами;) умное мышление – Jacob

Смежные вопросы