`
cywhoyi
  • 浏览: 421304 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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
分享到:
评论

相关推荐

    mysql函数、存储过程、触发器、游标.doc

    在存储过程中,游标用于迭代结果集并执行针对每一行的操作。在`oh_qty`存储过程中,`oh_cur`是游标,它从`inv`表中选取数据,并将每行的值分别赋给声明的变量。 4. **触发器**:触发器是数据库自动执行的预定义操作...

    mysql存储过程_游标_项目练习

    MySQL存储过程是数据库管理系统中一组为了完成特定功能的SQL语句集,它可以被保存和重复使用,提高了数据库的效率和可维护性。在本项目实践中,我们将深入学习和运用MySQL的存储过程,同时结合游标这一重要工具进行...

    mysql中游标的使用案例详解(学习笔记)

    在MySQL中,游标是一种重要的机制,它允许用户逐步处理查询结果集中的每一行数据。游标提供了一种方式来迭代处理查询结果,这对于需要逐行访问数据的情况特别有用。 **1.1 游标的基本含义** - **定义**:游标可以被...

    mysql存储过程 游标 循环使用介绍

    在存储过程中,我们首先声明一个游标,然后打开它,通过FETCH语句获取当前行,进行处理,最后关闭游标。在MySQL中,游标的声明通常包括定义返回的列数据类型。例如: ```sql DECLARE feeCodeCursor CURSOR FOR ...

    MySQL使用游标批量处理进行表操作

    游标允许我们按行遍历查询结果集,并对每一行执行特定的操作,例如批量添加索引或字段。下面将详细讲解如何使用游标进行这些操作。 首先,我们需要理解游标的声明、打开、前进和关闭等基本步骤: 1. 声明游标: ...

    游标和存储函数.docx

    在给定的示例中,使用游标`avg_func`统计指定课程的平均分,首先声明游标,然后在循环中处理每一行数据,计算总分和学生数,最后除以学生数得到平均分。 2. 存储函数(Stored Function): 存储函数是一段存储在...

    过程和游标实验.rar

    2. **声明与打开**:在SQL中,先声明游标,指定其对应的查询语句,然后通过OPEN语句打开游标,使游标指向结果集的第一行。 3. **移动与提取**:使用FETCH语句从游标中获取当前行的数据,可以向前或向后移动游标(如...

    MySQL数据库考试试题及答案-34页

    UNIQUE 索引用于保证各行在该索引上的值都不得重复。 12.事务处理 在 MySQL 中,COMMIT 语句用于将事务处理写到数据库中。 13.IS NOT NULL 运算符 IS NOT NULL 运算符用于判断记录中的某个字段是否为 NULL。 ...

    存储过程:利用游标+临时表实现查询

    - 游标(Cursor)允许我们遍历查询结果集,一次处理一行数据。它在数据库处理过程中非常有用,特别是当需要逐行处理数据或进行条件判断时。然而,需要注意的是,游标的使用可能会影响脚本执行速度,因此在不必要的...

    mysql高级部分--包含索引建立优化_函数_存储过程_触发器_及游标

    - `FETCH`: 获取下一行数据。 - `CLOSE`: 关闭游标。 #### 五、事务(Transaction) **定义:** 事务是数据库中一系列操作的集合,这些操作被视为一个单元,要么全部成功,要么全部失败。 **特点:** - **原子性...

    MySQL数据库考试测试试题(附答案).doc

    9. 索引:试题中涵盖了UNIQUE惟一索引的作用,包括保证各行在该索引上的值都不得重复。 10. 事务处理:试题中 涉及到commit命令的使用,用于将事务处理写到数据库。 11. 子查询:试题中涵盖了子查询的概念,包括...

    MySQL-python-1.2.4b4.win32-py2.7

    例如,`row = cursor.fetchone()`将获取第一行数据。 5. **提交事务**:对于需要事务处理的操作,使用`connection.commit()`来提交更改,`connection.rollback()`回滚事务。 6. **关闭连接**:完成数据库操作后,...

    MySQL数据库考试题与答案.doc

    11. 惟一索引:惟一索引的作用是保证各行在该索引上的值都不得重复。 12. 事务处理:可以使用 COMMIT 语句来将事务处理写到数据库中。 13. 查找条件:可以使用 IS NOT NULL 语句来查找条件为姓名不是 NULL 的记录...

    mysql-connector-python

    这款驱动程序由Oracle公司开发并维护,遵循Python DB-API 2.0规范,使得在Python应用中操作MySQL数据库变得简单易行。 MySQL Connector/Python支持多种Python版本,包括Python 2.7及更高版本的Python 3。通过这个...

    MySQL数据库面试宝典1.pdf

    - **Row-based**:记录每一行数据的变化,适用于大多数情况,因为它可以捕获所有的数据更改。 - **Statement-based**:记录执行的SQL语句,这种方式占用空间较少,但可能因为某些语句无法复制而导致问题。 #### 二...

    mysql.rar_mysql 类_mysql类

    MySQL是世界上最流行的关系型数据库管理系统之一,用于存储和管理数据。在PHP中,我们可以使用MySQLi或PDO_MySQL扩展来与MySQL数据库进行交互。在这个名为"mysql.rar"的压缩包中,包含了一个名为"mysql.php"的文件,...

    mysql高级语法教学

    MySQL的窗口函数允许你在一组行(一个“窗口”)上执行计算,而不仅仅是单行。这包括ROW_NUMBER()、RANK()、DENSE_RANK()用于排序,以及LEAD()、LAG()用于获取当前行前后行的值,还有SUM()、AVG()等聚合函数在特定...

    MySQL数据库考试试题及答案

    - **解析**:实体完整性是指确保关系中每一行数据都具有唯一标识符,通常通过设置外键约束来实现。 ### 21. 删除视图 - **知识点**:使用 `DROP VIEW` 语句来删除视图。 - **示例题目**:SQL语言中,删除一个视图的...

    MySQL存储过程基础教程.pdf

    游标允许在存储过程中迭代查询结果集,并对结果集中的每一行执行操作。游标特别适用于处理结果集中的多行数据。 #### 11. 安全性 存储过程中的权限设置可以保护数据安全,只允许拥有适当权限的用户执行特定的存储...

Global site tag (gtag.js) - Google Analytics