MySql 存儲過程 光標只循環一次


【1】MqSql 存儲過程 光標只循環一次

針對MySql存儲過程,光標只循環一次就退出的場景,可能原因分析:

(1)存儲過程有問題(仔細檢查語法、控制變量、條件等等)

(2)保證存儲過程正確。調用過程異常(即光標失效):

可能因為循環體內的Sql語句使用了select語句,如果有一個select語句查詢結果為空時,循環就會結束!

那么,想要循環繼續,需要在每個select語句后重置循環標志位為0,讓它繼續循環下去......

如下存儲過程 語句(更正后):

 1 DELIMITER $$
 2 DROP PROCEDURE IF EXISTS `demo`$$
 3 CREATE DEFINER=`root`@`%` PROCEDURE `demo`(IN para_product_id VARCHAR(32), IN para_cycle_id VARCHAR(32))
 4 BEGIN
 5     # 聲明變量
 6     DECLARE var_call_type INT DEFAULT 0;
 7     DECLARE var_fee_rate INT;
 8     DECLARE var_fee_unit INT;
 9     DECLARE var_np_id VARCHAR(36);
10     # 游標循環控制變量
11     DECLARE done INT DEFAULT 0;
12     # 聲明游標    
13     DECLARE idCur CURSOR FOR SELECT call_type, np_id, fee_unit, fee_rate
14                  FROM cfg_fee_rate
15                  WHERE product_id = IFNULL(para_product_id, '0000')
16                  ORDER BY LEVEL DESC;
17     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
18     
19     # 打開游標
20     OPEN idCur;
21     # 循環開始
22     REPEAT
23       FETCH idCur INTO var_call_type, var_np_id, var_fee_unit, var_fee_rate;
24           IF NOT done THEN
25           # 第一個select語句
26           SELECT fee_rate, fee_unit INTO var_fee_rate, var_fee_unit FROM cfg_np_rate 
27           WHERE np_id = IFNULL(var_np_id, 'none') ORDER BY call_type DESC LIMIT 1;
28           SET done = 0; # 這里很關鍵::因為如果select查詢不到數據項直接退出循環
29           # 第二個select語句
30           SELECT fee_rate, fee_unit INTO var_fee_rate, var_fee_unit FROM cfg_np_rate 
31           WHERE np_id = IFNULL(var_np_id, 'none') AND (1 = call_type OR '1' = call_type);
32           SET done = 0; # 這里很關鍵::因為如果select查詢不到數據項直接退出循環
33           # .... 其他語句
34       END IF;
35     UNTIL done END REPEAT; # 循環結束
36     CLOSE idCur; # 關閉游標
37 END$$
38 
39 DELIMITER ;

MySql存儲過程經典坑之一。

追加 解釋圖如下:

存儲過程。

 

Good Good Study, Day Day Up.

順序 選擇 循環 總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM