【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.
順序 選擇 循環 總結