MySQL定时任务:游标驱动的存储过程更新统计
MySQL定时job是一种在数据库管理系统(MySQL)中设置的自动化任务,用于按照预设的时间表执行特定的操作。在这个例子中,开发者使用了MySQL的存储过程来创建一个名为`test`的定时任务。存储过程是一个预编译的SQL脚本,可以在无需重新编译的情况下多次执行。这里的主要目标是通过游标(Cursor)处理多条更新操作,以优化性能并管理复杂的查询逻辑。 首先,我们看到`dropprocedureifexists test;`这行代码,它用于检查名为`test`的存储过程是否存在,如果存在则先删除,以避免重复执行。这是在执行新存储过程前的清理步骤,确保一致性。 创建存储过程的语句`CREATE PROCEDURE test()`开始了对任务的定义。在这个存储过程中,开发者声明了两个变量:`adv_id`(整型,用于存储游标返回的数据)和`Done`(布尔类型,默认值为0,用于判断是否已处理完所有数据)。 接下来的`DECLARE`语句定义了一个名为`result`的游标,用于执行SQL查询:从`api`表中选择status为1的记录。`DECLARE CONTINUE HANDLER FOR NOT FOUND`则设置了当没有更多数据时,游标会触发`Done`变量的值变为1,以便跳出循环。 在`OPEN result;`后,程序进入主循环,通过`LOOP_LABLE:`标签开始处理数据。在每次循环中,`FETCH`语句将游标中的下一条数据(即广告ID)读取到`adv_id`变量中。然后,根据`Done`变量的值决定是否继续循环或退出。 核心部分是`UPDATE`语句,它连接了`offerslook_offera`表和`total_offer`表,通过LEFT JOIN获取相关联的数据。这个`UPDATE`操作计算并更新统计信息,如总记录数、有效offer计数以及各种测试状态的计数。这里使用了子查询和条件`if`语句来实现复杂的数据处理和计数。 总结来说,这个MySQL定时job主要利用存储过程和游标技术来定期更新统计信息,通过多条件判断高效地处理并更新数据。这种方式提高了任务执行的效率,并且可以按需灵活调整任务内容,符合MySQL定时任务的灵活性和可扩展性。同时,通过存储过程,任务的执行逻辑被封装在一个独立的模块中,便于管理和维护。
CREATE PROCEDURE test()
Begin
declare adv_id int(11); /*定义属性*/
declare Done int DEFAULT 0;/*判断循环是否关闭的标志位*/
/*定义游标 以及赋值*/
declare result cursor for select offerslook_ad_id from api where `status`=1;
/*定义异常处理 */
declare continue handler for not found set Done =1;
/*打开游标*/
open result ;
/*循环开始*/
LOOP_LABLE:loop
/*提前游标的值 多个值的时候: fetch xxx into xxx,xxx */
fetch result into adv_id;
/*声明结束的时候*/
if Done=1 then leave LOOP_LABLE;end if;
update statistical_data,(SELECT * from (SELECT id,b.offerslook_ad_id,COUNT(*) as gOfferCount,COUNT(if(offerslook_offer_id is not null,true,null)) as offerslook_offer_count,
COUNT(if(test_status=1,true,null)) as jumpTimes1,COUNT(if(test_status=2,true,null)) as jumpTimes2,COUNT(if(test_status=3,true,null))
as jumpTimes3,COUNT(if(test_status=4,true,null)) as jumpTimes4,COUNT(if(test_status=5,true,null)) as jumpTimes5,
COUNT(if(test_status=6,true,null)) as jumpTimes6 from offerslook_offer a LEFT JOIN
(SELECT offerslook_ad_id,pk_tb_offerslook_id from total_offer) b on a.id=b.pk_tb_offerslook_id where offer_status=1 and b.offerslook_ad_id=adv_id) s) t
set statistical_data.gOfferCount=t.gOfferCount,statistical_data.offerslook_offer_count=t.offerslook_offer_count,statistical_data.jumpTimes1=t.jumpTimes1,
statistical_data.jumpTimes2=t.jumpTimes2,statistical_data.jumpTimes3=t.jumpTimes3,
statistical_data.jumpTimes4=t.jumpTimes4,statistical_data.jumpTimes5=t.jumpTimes5,statistical_data.jumpTimes6=t.jumpTimes6,statistical_data.cz_time=unix_timestamp() * 1000
where statistical_data.offerslook_ad_id=adv_id;
下载后可阅读完整内容,剩余2页未读,立即下载
- 粉丝: 0
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展