CREATE DEFINER=`mysql`@`%` EVENT `event_settle_order_30day` ON SCHEDULE EVERY 24 HOUR STARTS '2018-12-07 02:00:00' ON COMPLETION NOT PRESERVE ENABLE DO
/*
此定时任务每天2点执行一次
*/
BEGIN
declare done int default 0;
declare day30 datetime;
-- 定义游标的取值字段
declare _driverId int(10);
declare _amount double;
declare _startTime datetime;
declare _endTime datetime;
declare _orderNo varchar(50);
declare _settleId int(10);
declare _count1 int(10);
declare driverSettleList cursor for
select
td.driver_id as driverId,
sum(tor.driver_settle_amount) as amount,
min(tor.finish_time) as startTime,
max(tor.finish_time) as endTime ,
count(1) as count1
from t_order tor
inner join t_order_vehicle_rel tovr on tovr.order_no=tor.order_no and tor.`status`=1
inner join t_driver td on td.driver_id=tovr.driver_id and td.`status`=1
where tor.finish_time<day30
and tor.order_status=90
and (tor.invoice is null or tor.invoice=0)
and tor.driver_settle_id is null
group by td.driver_id;
-- 定义 设置循环结束标识done值怎么改变 的逻辑
declare continue handler for not FOUND set done=1;
set day30=date_add(NOW(), interval -30 day);
-- 打开游标
open driverSettleList;
label1:LOOP
fetch driverSettleList into _driverId,_amount,_startTime,_endTime,_count1;
if done then leave label1;
end if;
-- log
-- insert into t_test(content)value(CONCAT(_driverId,'-',_count1));
set _settleId=(select max(id)+1 from t_driver_settle);
insert into t_driver_settle (id,driver_id,amount,`status`,start_time,end_time,update_time,create_time,type,remark)
value(_settleId,_driverId,_amount,1,_startTime,_endTime,UTC_TIMESTAMP(),UTC_TIMESTAMP(),'cash',null);
begin
declare _inner tinyint(1) default 0;
declare settleOrderList cursor for
select tor.order_no as orderNo
from t_order tor
inner join t_order_vehicle_rel tovr on tovr.order_no=tor.order_no and tor.`status`=1
inner join t_driver td on td.driver_id=tovr.driver_id and td.`status`=1
where tor.finish_time<day30
and tor.order_status=90
and (tor.invoice is null or tor.invoice=0)
and tor.driver_settle_id is null
and td.driver_id=_driverId;
declare continue handler for not found set _inner = 1;
open settleOrderList;
label2:loop
fetch settleOrderList into _orderNo;
if _inner=1 then leave label2;
end if;
-- insert into t_test(content)value(CONCAT(_driverId,'-',_orderNo,'-',_settleId));
update t_order set driver_settle_id=_settleId where order_no=_orderNo;
end loop label2;
close settleOrderList;
end;
end LOOP label1;
close driverSettleList;
END
分享到:
相关推荐
Mysql存储过程游标触发器
MySQL 存储过程与游标的混合使用,也没啥重要的,就是和其他数据库有一些不同而已,作为总结,以后复习
Mysql存储过程、游标、函数调用、事务处理、触发器代码示例,可用作学习参考。
Oracle存储过程、游标、函数的详解
Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标
存储过程触发器 游标是数据库中的一个重要触发器,该篇讲述触发器详细,偏于广大学者学习参考。
Mysql游标(循环操作)
最近遇到这样的问题,在MySQL的存储过程中,游标操作时,需要执行一个conitnue的操作.众所周知,MySQL中的游标循环操作常用的有三种,LOOP,REPEAT,WHILE.三种循环,方式大同小异.以前从没用过,所以记下来,方便以后查阅. 1....
oracle 的函数、存储过程、游标、简单实例 oracle常用语句oracle 的函数、存储过程、游标、简单实例 oracle常用语句
如题,初步研究了pl/sql的写法,现给出存储过程,游标等的使用,后续会给出其他的用法
NULL 博文链接:https://kaka100.iteye.com/blog/964869
自己做的存储过程含游标例子,对于初学存储过程和游标的人有帮助
带游标的mysql存储过程例子。
(1)编写一个存储过程“某学生某课程考试成绩信息”输入学号和姓名,查询学生的姓名,课程名和考试成绩。 (2)创建存储过程“填班级人数”,根据学生表,修改班级表中的班级人数。
本节主要介绍了Mysql存储过程循环内如何嵌套使用游标,详细实现如下,需要的朋友不要错过
主要介绍了mysql存储过程之游标(DECLARE)原理与用法,结合实例形式详细分析了mysql存储过程游标(DECLARE)的基本功能、原理、使用方法及操作注意事项,需要的朋友可以参考下
SqlServer存储过程、游标讲解SqlServer存储过程、游标讲解
存储过程和游标详解.希望能帮助大你们,很好!
mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的结构: mysql> desc orders; +----------------+-------------+------+-----+--------...