2013-04-05 49 views
1

我正在處理存儲過程以更新產品表中的訂單字段。 現在只有問題是循環中的最後一項(cur),增加了兩次而不是一次(所以標記)。像這樣:SQL遊標和存儲過程訂單安排

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

我弄不明白爲什麼。在這種情況下的鏈接表(CategoryProduct)轉到38 2 CALL curorder(2);

存儲過程的一個CATEGORY_ID:

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數據庫。隨時歡迎任何有關改進程序的建議。

在此先感謝。

編輯:

我已經嘗試過的地方IF語句下面,但沒有結果的SET我聲明。

回答

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

祝你好運!

+0

謝謝它的作品! briljant。下一次生病嘗試用這樣的查詢來調試它);聰明的想法 – Jacob 2013-04-05 13:33:50