为什么MySQL游标在报告成功时停止循环
我在MySQL workbench 8.0.12社区win10中创建了一个过程,如下所示。游标被声明为循环遍历表中16000多个成员的ID,以将其在不同日期创建的订单数插入到另一个表中 此处为光标选择了成员ID及其注册日期<代码>从DICT_ALLE_AAAF中选择不同的行李,AAA>=日期记忆星。一旦我把它叫做为什么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循环从过程中
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_循环