`
jjjssh
  • 浏览: 77724 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

mysql存储过程外层游标内嵌一个子游标

阅读更多
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存储过程_游标_项目练习

    2. 使用游标:在存储过程中声明并打开一个游标,以便逐行处理查询结果。通过FETCH语句获取游标当前指向的数据行,并进行相应的操作。 3. 条件判断与循环:可能需要在存储过程中使用IF-ELSE结构进行条件判断,或者...

    Mysql存储过程游标触发器

    Mysql存储过程游标触发器

    MySQL 存储过程与游标的混合使用

    MySQL 存储过程与游标的混合使用,也没啥重要的,就是和其他数据库有一些不同而已,作为总结,以后复习

    sql存储过程和游标的运用

    我们定义了一个存储过程`chargemark`,该过程使用游标来遍历成绩表,并根据成绩的值来将其转换为等级制。 存储过程和游标的优点 使用存储过程和游标可以带来许多优点,例如: * 提高数据库的性能:存储过程可以预...

    Oracle存储过程、游标、函数的详解

    下面展示一个简单的存储过程示例,该过程接受一个部门编号作为输入参数,并返回该部门的所有员工信息: ```sql CREATE OR REPLACE PROCEDURE GetEmpByDept(deptno IN NUMBER) IS BEGIN FOR emp_rec IN (SELECT * ...

    Mysql游标(循环操作)

    在MySQL中,游标是一种数据库对象,主要用于处理存储过程中的结果集。游标允许我们逐行地读取查询结果,这对于需要对每一行数据执行特定操作的情况非常有用。通过使用游标,我们可以实现更加灵活的数据处理逻辑。 #...

    Mysql存储过程、游标、函数调用、事务处理、触发器代码示例

    Mysql存储过程、游标、函数调用、事务处理、触发器代码示例,可用作学习参考。

    存储过程和游标

    本例中需要创建一个名为“填班级人数”的存储过程,该过程使用游标遍历每个班级的学生数量,并更新到班级表中。具体实现如下: ```sql CREATE PROCEDURE 填班级表人数过程 AS BEGIN DECLARE @i INT, @classId CHAR...

    存储过程触发器 游标

    例如,在一个订单处理系统中,可以创建一个触发器,每当有新订单插入时,这个触发器会调用一个存储过程,该过程使用游标遍历订单的每一项商品,检查库存并更新相关记录。这样,系统可以自动跟踪库存变化,无需额外的...

    mysql 多个游标依次执行

    mysql存储过程 多个游标循环(依次执行,非嵌套循环)REPEAT循环。有需要的可自行下载。

    MySQL存储过程中游标循环的跳出和继续操作示例

    最近遇到这样的问题,在MySQL的存储过程中,游标操作时,需要执行一个conitnue的操作.众所周知,MySQL中的游标循环操作常用的有三种,LOOP,REPEAT,WHILE.三种循环,方式大同小异.以前从没用过,所以记下来,方便以后查阅. 1....

    SQL SERVER中的存储过程和游标的使用大综合

    3. **减少网络流量**:多次调用一个存储过程比发送多个单独的SQL语句更节省网络资源。 4. **易于维护**:存储过程内的代码可以集中修改,降低了维护成本。 创建存储过程的基本语法如下: ```sql CREATE PROCEDURE ...

    Java调用oracle存储过程通过游标返回临时表

    如果存储过程返回游标,我们需要声明一个`OUT`参数来接收。 4. **执行存储过程**:通过`pstmt.execute()`执行存储过程。这将打开一个游标,我们可以从游标中获取结果。 5. **处理游标结果**:使用`...

    Oracle存储过程out游标

    在PL/SQL中,声明一个Out类型的游标变量,然后在存储过程中打开这个游标执行查询,最后在调用者中通过这个游标变量获取数据。例如: ```sql CREATE OR REPLACE PROCEDURE get_data ( cursor_out OUT SYS_REFCURSOR...

    Mysql存储过程循环内嵌套使用游标示例代码

    在MySQL中,存储过程是一种预编译的SQL语句集合,可以用于执行复杂的数据库操作,包括循环和游标的使用。游标允许我们逐行处理查询结果,这对于迭代数据进行处理非常有用。本示例中,我们将探讨如何在存储过程中循环...

    mysql游标存储过程例子

    根据提供的文件信息,本文将详细解释一个MySQL存储过程的例子,其中包含了游标的使用。这个存储过程主要用于处理一批数据,涉及到日期范围内的数据处理、异常处理等。下面将逐一解析存储过程中涉及的重要知识点。 #...

    Oracle存储过程游标详解

    当查询返回结果超过一行时,就需要一个显式游标。 REF 游标是动态关联结果集的临时对象。游标的状态是通过属性来表示,可以通过 %Found、%NotFound、%ISOpen、%RowCount 等属性来获取游标的状态。 在使用游标时,...

Global site tag (gtag.js) - Google Analytics