MySQL存储过程for循环处理查询结果

MySQL数据库中,存储过程是一种预编译的SQL语句集,可以被多次调用。在MySQL中使用存储过程查询到结果后,有时候需要对这些结果进行循环处理。

1. 创建表

CREATE TABLE `t_job` (
  `job_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `job_name` varchar(50) DEFAULT NULL,
  `next_time` timestamp NULL DEFAULT NULL COMMENT '下次执行时间',
  `last_task` int(11) DEFAULT NULL,
  PRIMARY KEY (`job_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;

CREATE TABLE `t_task` (
  `task_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `start_time` datetime DEFAULT NULL,
  `end_time` datetime DEFAULT NULL,
  `status` tinyint(1) DEFAULT NULL,
  `job_id` int(11) NOT NULL,
  PRIMARY KEY (`task_id`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8mb4;

2. 存储过程查询结果

2.1 创建存储过程

创建一个简单的存储过程来查询数据

CREATE DEFINER=`root`@`%` PROCEDURE `p_sayn_job`()
BEGIN
	#Routine body goes here...
	DECLARE v_cnt INT;
	DECLARE v_job_id INT; 
	
	
	SELECT count( 1 ) INTO v_cnt 
	  FROM 	t_job j 
	 WHERE 	j.next_time < SYSDATE();
	 
	IF 	v_cnt > 0 THEN	
	
	 -- 插入数据
		INSERT INTO t_task ( start_time, end_time, STATUS, job_id )
			VALUES
	  (SYSDATE(), SYSDATE()+ 1, 1, v_job_id );			

		-- 更新数据
		UPDATE t_job j 
			 SET j.last_task = ( SELECT MAX( t.task_id ) FROM t_task t WHERE t.job_id = j.job_id ),
					 j.next_time = DATE_ADD( j.next_time, INTERVAL 1 DAY ) 
		 WHERE j.job_id = v_job_id;

	
	END IF;
	
END

2.2 添加for循序语句

DECLARE语句声明游标jobs

-- DECLARE语句声明游标
DECLARE jobs CURSOR FOR
(SELECT j.job_id FROM t_job j WHERE j.next_time > SYSDATE());	

DECLARE语句声明结束标识v_finished

-- 声明变量
DECLARE v_finished  int DEFAULT FALSE;
-- 结束标识
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = TRUE;

OPEN语句打开游标

-- 	OPEN语句打开游标
OPEN  jobs ;

循环迭代jobs

-- 	循环迭代 jobs 
read_loop : LOOP

END LOOP read_loop;

使用FETCH语句检索光标指向的下一行,并将光标移动到结果集中的下一行。

-- 	使用FETCH语句检索光标指向的下一行,并将光标移动到结果集中的下一行。
FETCH jobs into v_job_id;

使用v_finished变量来检查列表是否有id来终止循环。

-- 	使用v_finished变量来检查列表是否有id来终止循环。
IF v_finished THEN
	LEAVE read_loop; 
END IF;

写入自己的处理业务SQl,然后CLOSE语句以停用游标并释放与其关联的内存。

-- CLOSE语句以停用游标并释放与其关联的内存
CLOSE jobs;

完整的存储过程,如下:

CREATE DEFINER=`root`@`%` PROCEDURE `p_sayn_job`()
BEGIN#Routine body goes here...
	DECLARE v_cnt INT;
	DECLARE v_finished  int DEFAULT FALSE;
	DECLARE v_job_id INT; 
	-- DECLARE语句声明游标
	DECLARE jobs CURSOR FOR
		  (SELECT j.job_id FROM t_job j WHERE j.next_time > SYSDATE());	
	-- 结束标识
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = TRUE;

	SELECT count( 1 ) INTO v_cnt 
	  FROM 	t_job j 
	 WHERE 	j.next_time < SYSDATE();
		
	IF 	v_cnt > 0 THEN
		
		-- 	OPEN语句打开游标
		OPEN  jobs ;
		-- 	循环迭代 jobs 
		read_loop : LOOP
				-- 	使用FETCH语句检索光标指向的下一行,并将光标移动到结果集中的下一行。
		   FETCH jobs into v_job_id;

			-- 	使用v_finished变量来检查列表是否有id来终止循环。
			IF v_finished THEN
				LEAVE read_loop; 
			END IF; 
			-- 处理业务SQl 就在这了
				INSERT INTO t_task ( start_time, end_time, STATUS, job_id )
			      VALUES
				 ( SYSDATE(), SYSDATE()+ 1, 1, v_job_id );			
			
			
			  UPDATE t_job j 
					 SET j.last_task = ( SELECT MAX( t.task_id ) FROM t_task t WHERE t.job_id = j.job_id ),
					   	 j.next_time = DATE_ADD( j.next_time, INTERVAL 1 DAY ) 
			 	 WHERE j.job_id = v_job_id;
			
			
		END LOOP read_loop;
		-- CLOSE语句以停用游标并释放与其关联的内存
		CLOSE jobs;

		
	END IF;
END

在这里插入图片描述

2.3 保存执行存储过程

CALL p_sayn_job();

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/640740.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python02 循环与容器

一、if的条件判断 1-1 if elif else 判断年龄属于哪个年龄段 # 判断学生 core input(请输入成绩) ​ if int(core) >90 :print(优秀) elif int(core) >70 and int(core) <90:print(中等) elif int(core) >60 and int(core) <70:print(及格) else:print(不及…

抖音运营_打造高流量的抖音账号

目录 一 账号定位 行业定位 用户定位 内容定位 二 账号人设 我是谁? 我的优势 我的差异化 三 创建账号 名字 头像 简介 四 抖音养号 为什么要养号&#xff1f; 抖音快速养号 正确注册抖音账号 一机一卡一号 实名认证 正确填写账号信息 养号期间的操作 五…

如何在Windows 11和10上检查计算机的正常运行时间,这里有两种方法

序言 你的计算机的正常运行时间告诉你打开计算机已经有多长时间了。如果你需要这些信息进行故障排除或其他操作&#xff0c;那么很容易在Windows 11和Windows 10操作系统上找到你的正常运行时间。我们将向你展示图形和命令行方法。让我们开始吧。 使用任务管理器查找Windows正…

webman使用summernote富文本编辑器

前言 Summernote富文本编辑器功能强大&#xff0c;可以直接从word直接复制内容过来而不破坏原有的文档格式&#xff0c;非常适合做商品详情等内容的编辑工具。本文将展示如何在php高性能框架webman中使用summernote编辑器。 下载 去Bootstrap 中文网、Summernote、jQuery官网…

JavaWeb知识点汇总(Tomcat、Servlet、MVC架构、模拟IOC、Filter、Listener)

CS、BS架构模式 创建Web项目 介绍 Tomcat是Web容器。可以将一个或多个Web项目 部署在tomcat服务器中。 Tomcat目录&#xff1a; 创建web项目步骤 新建一个project项目 pro-web 项目project和模块module的区别&#xff1a; project 通常指一个完整的软件开发实体&#xff0c;它…

小程序视频怎么保存到本地相册

在快节奏的生活中&#xff0c;小程序已成为我们获取信息和娱乐的重要渠道。但当您遇到那些精彩绝伦的小程序视频&#xff0c;是否曾想过如何将它们保存到本地相册&#xff0c;以便随时回味&#xff1f;无论您是安卓用户还是iPhone用户&#xff0c;本文将为您揭秘如何轻松实现这…

机器学习之常用算法与数据处理

一、机器学习概念&#xff1a; 机器学习是一门多领域交叉学科&#xff0c;涉及概率论、统计学、计算机科学等多门学科。它的核心概念是通过算法让计算机从数据中学习&#xff0c;改善自身性能。机器学习专门研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新的知识…

完成商品SPU管理页面

文章目录 1.引入前端界面1.将前端界面放到commodity下2.创建菜单3.进入前端项目&#xff0c;使用npm添加依赖1.根目录下输入2.报错 chromedriver2.27.2的问题3.点击链接下载压缩包&#xff0c;然后使用下面的命令安装4.再次安装 pubsub-js 成功5.在main.js中引入这个组件 4.修改…

Java进阶学习笔记5——Static应用知识:单例设计模式

设计模式&#xff1a; 架构师会使用到设计模式&#xff0c;开发框架&#xff0c;就需要掌握很多设计模式。 在Java基础阶段学习设计模式&#xff0c;将来面试笔试的时候&#xff0c;笔试题目会经常靠到设计模式。 将来会用到设计模式。框架代码中会用到设计模式。 什么是设计…

linux常用软件源码安装-2

jdk、tomcat、Apache、nginx、mysql、redis、maven、nexus安装文档&#xff1a;linux常用软件源码安装 9.sonarqube安装 前置条件&#xff1a;mysql5.6和jdk8 1.下载 官网 2.安装unzip并解压sonarqube&#xff0c;然后移动到/usr/local yum install -y unzip unzip sonarq…

ChatGPT写作指南:掌握5种高效格式成为写作达人【含实用示例】

1. **简洁指令** 当任务较简单时&#xff0c;可以用一小段话来说明&#xff0c;便于理解和执行。如下例&#xff1a; 背景&#xff1a;我负责运营一个旅游主题的社交媒体账号。 角色&#xff1a;作为一位经验丰富的文案创作专家&#xff0c;我擅长打造引人注目的旅游内容…

springcloud第4季 springcloud-gateway网关predict案例场景

一 predict案例场景 1.1 说明 本博客所有案例操作&#xff0c;都在上篇博客的基础上进行&#xff1a; springcloud第4季 springcloud-gateway网关的功能作用_cloud gateway干嘛的-CSDN博客 1.2 案例前提准备 1. 启动zipkin服务 2.启动consul服务 3.启动3个应用服务 二 …

免费、开源、好用的 SQL 客户端合集

免费、开源、好用的 SQL 客户端合集 分类 编程技术 0、SQL Chat SQL Chat 是 2023 年 3 月推出的新型 SQL 客户端&#xff0c;它将数据库管理带入了基于聊天的新时代。 SQL Chat 由 ChatGPT 驱动&#xff0c;能够帮你编写和润色 SQL 语句&#xff0c;让数据库操作变得更加智…

记录Python低代码开发框架zdppy_amcrud的开发过程

实现新增接口 基础代码 import env import mcrud import api import snowflakeenv.load(".env") db mcrud.new_env()table "user" columns ["name", "age"]async def add_user(req):data await api.req.get_json(req)values [d…

C#_初识变量类型与方法

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp2 {class Program{static void Main(string[] args){///--------常用的变量类型float a 3.12f; //单精度32bit浮点型后缀要加fdou…

最新版npm详解

如&#xff1a;npm中搜索 jQuery image.png image.png 接地气的描述&#xff1a;npm 类似于如下各大手机应用市场 image.png image.png 查看本地 node 和 npm 是否安装成功 image.png image.png 或 npm install -g npm image.png image.png image.png image.png image.…

齐护K210系列教程(三十)_多任务切换

多任务切换 1&#xff0c;任务1的设定2&#xff0c;任务2的设定3&#xff0c;主程序4&#xff0c; 课程资源联系我们 在开发项目时&#xff0c;我们常会用到AIstart的多个任务来切换应用&#xff0c;比如当我识别到某种卡片时&#xff0c;要切换到别的任务&#xff0c;这样就要…

【管理咨询宝藏111】安永某集团供应链流程设计及现状分析报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏111】安永某集团供应链流程设计及现状分析报告 【格式】PDF版本 【关键词】安永、供应链、流程优化 【核心观点】 - 缺乏客户分级&#xff0c;无…

flutter开发实战-美颜前后对比图效果实现

flutter开发实战-美颜前后对比图效果实现 最近使用代码中遇到了图片前后对比&#xff0c;这里使用的是CustomClipper来实现 一、CustomClipper 我们实现CustomClipper子类来实现美颜后的图片裁剪功能 getClip()是用于获取剪裁区域的接口&#xff0c;由于图片大小是6060&am…

刷代码随想录有感(76):回溯算法——全排列

题干&#xff1a; 代码&#xff1a; class Solution { public:vector<int> tmp;vector<vector<int>> res;void backtracking(vector<int> nums, vector<int> used){if(tmp.size() nums.size()){res.push_back(tmp);return;}for(int i 0; i &l…