为什么MySQL游标在报告成功时停止循环

为什么MySQL游标在报告成功时停止循环,mysql,loops,cursor,Mysql,Loops,Cursor,我在MySQL workbench 8.0.12社区win10中创建了一个过程,如下所示。游标被声明为循环遍历表中16000多个成员的ID,以将其在不同日期创建的订单数插入到另一个表中 此处为光标选择了成员ID及其注册日期从DICT_ALLE_AAAF中选择不同的行李,AAA>=日期记忆星。一旦我把它叫做call PRO_MIDD_MEMB_AAAA_1('2017/01/01'、'2019/11/10',60),它只循环通过5个成员的ID,没有报告任何错误。但是,如果我将while循环从过程中

我在MySQL workbench 8.0.12社区win10中创建了一个过程,如下所示。游标被声明为循环遍历表中16000多个成员的ID,以将其在不同日期创建的订单数插入到另一个表中

此处为光标选择了成员ID及其注册日期<代码>从DICT_ALLE_AAAF中选择不同的行李,AAA>=日期记忆星。一旦我把它叫做
call PRO_MIDD_MEMB_AAAA_1('2017/01/01'、'2019/11/10',60)
,它只循环通过5个成员的ID,没有报告任何错误。但是,如果我将
while
循环从过程中取出,并且
select Var_BAG
处于启用状态,光标循环将选择200多个成员的ID,直到它要求我取消它。有人能告诉我我的代码出了什么问题吗?非常感谢

delimiter //
create procedure PRO_MIDD_MEMB_AAAA_1
(in Date_Memb_Star date,
in Date_Sale_End date,
in Int_Inte int)
begin

    declare Int_Floo int default 0;
    declare Int_Ceil int;
    declare Int_MembAll int;
    declare Int_Loop int default 1;
    declare Int_MaxiLoop int;
    declare Int_DaySpen int default 30;

    declare Int_Done int;
    declare Var_BAG varchar(16);
    declare Date_Memb_Regi date;
    declare Cur_Memb cursor for 
    select distinct BAG,AAA from DICT_ALLE_AAAF where AAA>=Date_Memb_Star order by BAG;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET Int_Done = 1;

    truncate table MIDD_MEMB_AAAA;

    open Cur_Memb;
    read_loop:loop
        fetch Cur_Memb into Var_BAG,Date_Memb_Regi;
        if Int_Done=1 then
            leave read_loop;
        end if;

        /*select Var_BAG;*/

        set Int_MaxiLoop=ceil(datediff(Date_Sale_End,Date_Memb_Regi)/Int_Inte);

        set Int_Floo=0;

            while Int_Loop<=Int_MaxiLoop do  

            set Int_Ceil=Int_Floo+Int_Inte;

            insert into MIDD_MEMB_AAAA
            select Var_BAG,Int_Floo,Int_Ceil, 
            count(distinct BAK)*(Int_DaySpen/Int_Inte) as Numb_Con_Avg
            from OPER_SALE_AAAB 
            where BAG=Var_BAG
            and timestampdiff(hour,Date_Memb_Regi,AAA)/24>Int_Floo 
            and timestampdiff(hour,Date_Memb_Regi,AAA)/24<=Int_Ceil
            and AAB>0;

            set Int_Floo=Int_Floo+Int_Inte;

            set Int_Loop=Int_Loop+1;
        end while;   

        end loop read_loop;

    close Cur_Memb;
end//
delimiter ;
分隔符//
创建程序PRO_MIDD_MEMB_AAAA_1
(在日期/成员/明星日期中,
输入日期\销售日期\结束日期,
以整数表示(整数)
开始
声明Int_Floo Int默认值为0;
声明Int_Ceil Int;
声明Int_MembAll Int;
声明Int_Loop Int default 1;
声明Int_MaxiLoop Int;
声明Int_DaySpen Int default 30;
声明Int_Done Int;
声明Var_BAG varchar(16);
宣布注册日期;
将Cur_Memb游标声明为
从DICT_ALLE_AAAF中选择不同的行李AAA,其中AAA>=按行李订购的日期;
为未找到的集合Int_Done=1声明CONTINUE处理程序;
截断表MIDD_MEMB_AAAA;
打开Cur_Memb;
读循环:循环
将Cur_Memb放入Var_袋子中,日期_Memb_Regi;
如果Int_Done=1,则
离开read_循环;
如果结束;
/*选择Var_BAG*/
设置Int\u maxilop=ceil(datediff(Date\u Sale\u End,Date\u Memb\u Regi)/Int\u Inte);
设置Int_Floo=0;
而Int_LoopInt_Floo
时间差(小时,日期,AAA)/240;
设置Int_Floo=Int_Floo+Int_Inte;
设置Int_Loop=Int_Loop+1;
结束时;
结束循环读取循环;
关闭Cur_Memb;
结束//
定界符;

小疏忽:您忘记重置变量
Int\u Loop
,因此在第一次运行后,只有当
Int\u MaxiLoop
有新的最大值时,它才会进入循环

在循环之前重新初始化它(我假设为1):

    ...
    set Int_Floo=0;
    set Int_Loop=1;
    while Int_Loop<=Int_MaxiLoop do  ...
。。。
设置Int_Floo=0;
设置Int_Loop=1;
而Int_循环