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
分享到:
相关推荐
2. 使用游标:在存储过程中声明并打开一个游标,以便逐行处理查询结果。通过FETCH语句获取游标当前指向的数据行,并进行相应的操作。 3. 条件判断与循环:可能需要在存储过程中使用IF-ELSE结构进行条件判断,或者...
Mysql存储过程游标触发器
MySQL 存储过程与游标的混合使用,也没啥重要的,就是和其他数据库有一些不同而已,作为总结,以后复习
我们定义了一个存储过程`chargemark`,该过程使用游标来遍历成绩表,并根据成绩的值来将其转换为等级制。 存储过程和游标的优点 使用存储过程和游标可以带来许多优点,例如: * 提高数据库的性能:存储过程可以预...
下面展示一个简单的存储过程示例,该过程接受一个部门编号作为输入参数,并返回该部门的所有员工信息: ```sql CREATE OR REPLACE PROCEDURE GetEmpByDept(deptno IN NUMBER) IS BEGIN FOR emp_rec IN (SELECT * ...
在MySQL中,游标是一种数据库对象,主要用于处理存储过程中的结果集。游标允许我们逐行地读取查询结果,这对于需要对每一行数据执行特定操作的情况非常有用。通过使用游标,我们可以实现更加灵活的数据处理逻辑。 #...
Mysql存储过程、游标、函数调用、事务处理、触发器代码示例,可用作学习参考。
本例中需要创建一个名为“填班级人数”的存储过程,该过程使用游标遍历每个班级的学生数量,并更新到班级表中。具体实现如下: ```sql CREATE PROCEDURE 填班级表人数过程 AS BEGIN DECLARE @i INT, @classId CHAR...
例如,在一个订单处理系统中,可以创建一个触发器,每当有新订单插入时,这个触发器会调用一个存储过程,该过程使用游标遍历订单的每一项商品,检查库存并更新相关记录。这样,系统可以自动跟踪库存变化,无需额外的...
mysql存储过程 多个游标循环(依次执行,非嵌套循环)REPEAT循环。有需要的可自行下载。
最近遇到这样的问题,在MySQL的存储过程中,游标操作时,需要执行一个conitnue的操作.众所周知,MySQL中的游标循环操作常用的有三种,LOOP,REPEAT,WHILE.三种循环,方式大同小异.以前从没用过,所以记下来,方便以后查阅. 1....
3. **减少网络流量**:多次调用一个存储过程比发送多个单独的SQL语句更节省网络资源。 4. **易于维护**:存储过程内的代码可以集中修改,降低了维护成本。 创建存储过程的基本语法如下: ```sql CREATE PROCEDURE ...
如果存储过程返回游标,我们需要声明一个`OUT`参数来接收。 4. **执行存储过程**:通过`pstmt.execute()`执行存储过程。这将打开一个游标,我们可以从游标中获取结果。 5. **处理游标结果**:使用`...
在PL/SQL中,声明一个Out类型的游标变量,然后在存储过程中打开这个游标执行查询,最后在调用者中通过这个游标变量获取数据。例如: ```sql CREATE OR REPLACE PROCEDURE get_data ( cursor_out OUT SYS_REFCURSOR...
在MySQL中,存储过程是一种预编译的SQL语句集合,可以用于执行复杂的数据库操作,包括循环和游标的使用。游标允许我们逐行处理查询结果,这对于迭代数据进行处理非常有用。本示例中,我们将探讨如何在存储过程中循环...
根据提供的文件信息,本文将详细解释一个MySQL存储过程的例子,其中包含了游标的使用。这个存储过程主要用于处理一批数据,涉及到日期范围内的数据处理、异常处理等。下面将逐一解析存储过程中涉及的重要知识点。 #...
当查询返回结果超过一行时,就需要一个显式游标。 REF 游标是动态关联结果集的临时对象。游标的状态是通过属性来表示,可以通过 %Found、%NotFound、%ISOpen、%RowCount 等属性来获取游标的状态。 在使用游标时,...