mysql游标最后一行重复问题

就是根据值的标签值,作为下一阶段是否插入的标示
BEGIN
declare v_user_Id bigint(20);
declare v_order_Id bigint(20);
declare v_ref_t int(11);
declare v_ref_c varchar(64);
declare v_entry_ref_p int(11);
declare v_entry_ref_b int(11);
declare v_entry_ref_pos int(11);
declare v_entry_ref_path varchar(128);
declare no_more_data int default 0;  
declare v_tmp_date timestamp;
declare v_tmp_hour int(11);
declare v_trans_hour int(11);
-- 订单生成时间
declare v_create_time timestamp;
-- 检索开始时间,默认是从当天的0时
declare v_start_time timestamp;
-- 检索结束时间,默认是当天的24:00时
declare v_end_time timestamp;
-- 检索结束时间,默认是当天的24:00时
declare v_transfer_time timestamp;
-- 时间段
declare v_hourtime int(11);
declare v_hour int(11);
declare v_count int(11);
declare v_count2 int(11);
declare entrynumbers cursor  for  SELECT user_id,order_id,ref_t,ref_c,entry_ref_p,entry_ref_b,entry_ref_pos,entry_ref_path,create_time FROM bi_wbt.wbt_rpt_output   where create_time >= v_start_time and create_time <= v_end_time  ; 
  -- 设置一个终止标记  
declare continue handler for not found set no_more_data=1

-- 获取参数时间,精确到某日
set v_tmp_date=DATE_FORMAT(CURDATE(),'%Y-%m-%d');
-- 遍历某日下该时间点之前24小时内的数据
set v_tmp_hour=hour(CURTIME());
set v_trans_hour=v_tmp_hour-24;
set v_end_time=DATE_ADD(v_tmp_date, INTERVAL v_tmp_hour hour);

set v_start_time=DATE_ADD(v_end_time, INTERVAL -24 hour);

-- select v_start_time as 开始时间,v_end_time as 结束时间 , v_tmp_hour as 几时;
SELECT count(*) FROM bi_wbt.wbt_rpt_output   where create_time >= v_start_time and create_time <= v_end_time  into v_count; 
-- 判断元数据产出表该时间端有内容 , 无内容无需同步
if(v_count<>0)
then
-- 判断是否有必要24小时全量同步
SELECT count(*) FROM dw_wbt.wbt_order_output_detail   where create_time >= v_start_time and create_time <= v_end_time  into v_count2; 
if(v_count2=0)
then
set no_more_data=0;
-- 打开游标  
open entrynumbers;  
  -- 循环所有的行  
repeat  
fetch entrynumbers into v_user_Id,v_order_Id,v_ref_t,v_ref_c,v_entry_ref_p,v_entry_ref_b,v_entry_ref_pos,v_entry_ref_path,v_create_time;  
if(no_more_data=0) THEN
insert into dw_wbt.wbt_order_output_detail (user_id,order_id,ref_t,ref_c,entry_ref_p,entry_ref_b,entry_ref_pos,entry_ref_path,create_time ) values(v_user_Id,v_order_Id,v_ref_t,v_ref_c,v_entry_ref_p,v_entry_ref_b,v_entry_ref_pos,v_entry_ref_path,v_create_time);
END IF;
until no_more_data=1     
end repeat;  

-- 关闭游标  
close entrynumbers;
-- 还要需判断之前时间跟该时间之内超过24小时 
else
select create_time from dw_wbt.wbt_order_output_detail  where id =(select max(id) from dw_wbt.wbt_order_output_detail) into v_transfer_time;

set v_start_time=DATE_ADD(v_transfer_time, INTERVAL 1 hour);
set v_hour=hour(timediff(v_end_time,v_start_time));
-- 判断超过24小时的,不需要更新
if(v_hour>24)
then
set v_hour=v_hour-24;
set v_start_time=DATE_ADD(v_transfer_time, INTERVAL v_hour hour);
end if;
SELECT count(*) FROM bi_wbt.wbt_rpt_output   where create_time >= v_start_time and create_time <= v_end_time  into v_count2; 
if(v_count2<>0)
then
set no_more_data=0;
-- 打开游标  
open entrynumbers;  
  -- 循环所有的行  
repeat  
fetch entrynumbers into v_user_Id,v_order_Id,v_ref_t,v_ref_c,v_entry_ref_p,v_entry_ref_b,v_entry_ref_pos,v_entry_ref_path,v_create_time;   
if(no_more_data=0) THEN

insert into dw_wbt.wbt_order_output_detail (user_id,order_id,ref_t,ref_c,entry_ref_p,entry_ref_b,entry_ref_pos,entry_ref_path,create_time ) values(v_user_Id,v_order_Id,v_ref_t,v_ref_c,v_entry_ref_p,v_entry_ref_b,v_entry_ref_pos,v_entry_ref_path,v_create_time);


END IF;
until no_more_data=1   

end repeat;  
-- 关闭游标  
close entrynumbers; 
end if;

end if;
end if;
END

猜你喜欢

转载自cywhoyi.iteye.com/blog/1638570