MySQL 存储过程中多个游标嵌套使用实例

DELIMITER $$

USE `parkinglot`$$

DROP PROCEDURE IF EXISTS `distinguishFocusCarProc`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `distinguishFocusCarProc`()
BEGIN
	-- 声明一个标志done,用来判断游标是否遍历完成
	DECLARE done INT DEFAULT 0;
	DECLARE id INT;
	DECLARE license_plate VARCHAR(20);
	DECLARE is_focus_car BIT;
	DECLARE is_alarm BIT;
	DECLARE licensePlate VARCHAR(20);
	DECLARE message VARCHAR(255);
	
	-- 声明第一个游标(存放近3分钟获取的新进车辆信息列表)
	DECLARE cur1 CURSOR FOR SELECT ai.`id`,ai.`license_plate`,ai.`is_focus_car`,ai.`is_alarm` FROM alarm_info ai 
	WHERE ai.`create_time` >= DATE_SUB(NOW(),INTERVAL  3 MINUTE);
	-- 声明第二个游标(存放的是重点车辆的信息列表,需要比对)
	DECLARE cur2 CURSOR FOR SELECT kv.`license_plate` licensePlate,kv.`message` FROM key_vehicles kv;
	-- 在游标循环到最后会将 done 设置为 1(如果不加该行  游标为空的时候  就会报错)
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
	-- 打开游标
	OPEN cur2;
	    REPEAT
	        FETCH cur2 INTO licensePlate,message;
		    IF NOT done THEN
		        OPEN cur1;		
			    REPEAT	
				FETCH cur1 INTO id,license_plate,is_focus_car,is_alarm;
				IF NOT done THEN
				    IF license_plate = LicensePlate THEN
					UPDATE alarm_info ai SET ai.`is_focus_car` = 1,ai.`alarm_flag` = message WHERE ai.`id` = id;
				    END IF;
				END IF;
			    UNTIL done END REPEAT;	
			CLOSE cur1;
			-- 注意这里,当内层游标循环完毕以后需要将done设置成0,否则外层循环只会进行一次
			SET done = 0;
		    END IF;
	    UNTIL done END REPEAT;
	CLOSE cur2;   		
    END$$

DELIMITER ;

循环和java语法其实比较类似,需要注意内层循环完毕之后要将标志done设置成false(0),否则外层循环只会进行一次

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值