• 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.

    顺序 选择 循环 总结

  • 相关阅读:
    零基础入门深度学习(1)
    RxJava 复杂场景 Schedulers调度
    Kotlin 学习
    Cordova CrossWalk
    Android Studio工程导入另一个工程作为lib
    Android 数据存储相关
    Android Activity 生命周期中onStart()和onResume()的区别
    反省与规划
    Android 依赖注入 ButterKnife 基本使用
    Android Socket 相关
  • 原文地址:https://www.cnblogs.com/Braveliu/p/10144510.html
Copyright © 2020-2023  润新知