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

news2025/9/17 17:46:49

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();

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手写tomcat(Ⅰ)——tomcat原理

Tomcat简介 众所周知&#xff0c;动态web项目基本就是使用了tomcat作为服务端 动态web项目的目录结构 Tomcat是一个轻量级的服务器&#xff0c;其实就是一个Java程序&#xff0c;能够作为一个服务端去接收客户端的请求&#xff0c;并返回给客户端响应 Tomcat本身是一个容器…

基于Keras的手写数字识别(附源码)

目录 引言 为什么要创建虚拟环境&#xff0c;好处在哪里&#xff1f; 源码 我修改的部分 调用本地数据 修改第二层卷积层 引言 本文是博主为了记录一个好的开源代码而写&#xff0c;下面是代码出处&#xff01;强烈建议收藏&#xff01;【深度学习实战—1】&#xff1a…

5、sqlmap注入post类型+os-shell

题目&#xff1a;青少年&#xff1a;Easy_SQLi 1、打开网页&#xff0c;是一个登入表单 2、判断注入类型&#xff0c;是一个字符注入&#xff0c;使用or直接绕过密码进去了 3、上bp抓取数据包&#xff0c;sqlmmap用post注入走一遍&#xff0c;找到数据库&#xff0c;账号密码&…

【Linux】TCP协议【中】{确认应答机制/超时重传机制/连接管理机制}

文章目录 1.确认应答机制2.超时重传机制&#xff1a;超时不一定是真超时了3.连接管理机制 1.确认应答机制 TCP协议中的确认应答机制是确保数据可靠传输的关键部分。以下是该机制的主要步骤和特点的详细解释&#xff1a; 数据分段与发送&#xff1a; 发送方将要发送的数据分成一…

Linux网络编程:HTTP协议

前言&#xff1a; 我们知道OSI模型上层分为应用层、会话层和表示层&#xff0c;我们接下来要讲的是主流的应用层协议HTTP&#xff0c;为什么需要这个协议呢&#xff0c;因为在应用层由于操作系统的不同、开发人员使用的语言类型不同&#xff0c;当我们在传输结构化数据时&…

JVM-调优之-如何使用arthas-观察jvm-cpu-内存-垃圾回收等信息

前言&#xff1a; 可以简单代替把dump文件下载下来后用visualvm分析了&#xff1b;跟visualvm类似的&#xff1b; docker中如何安装arthas看这个&#xff1a;docker中怎么使用arthas_arthas 集成到容器镜像-CSDN博客 curl -O https://arthas.aliyun.com/arthas-boot.jar wget …

闲话 .NET(5):.NET Core 有什么优势?

前言 .NET Core 并不是 .NET FrameWork 的升级版&#xff0c;它是一个为满足新一代的软件设计要求而从头重新开发的开发框架和平台&#xff0c;所以它没有 .NET FrameWork 的历史包袱&#xff0c;相对于 .NET FrameWork&#xff0c;它具备很多优势。 .NET Core 有哪些优势&am…

列主元消去法和矩阵三角分解法求解线性方程组

目录 列主元消去法矩阵三角分解法 列主元消去法 构建增广矩阵&#xff1a; 将线性方程组写成矩阵形式 &#x1d434;&#x1d44b;&#x1d435;&#xff0c;并将系数矩阵 &#x1d434;与常数向量 &#x1d435;组成增广矩阵 [&#x1d434;∣&#x1d435;]。选择主元&#…

ACW石子合并-XMUOJ元素共鸣:唤醒神之眼 -区间DP

题目 思路 话不多说&#xff0c;直接上代码 代码 /* ACW石子合并-XMUOJ元素共鸣&#xff1a;唤醒神之眼 JinlongW-2024/05/25 区间DP 当i<j时&#xff0c;f[i][j]min(f[i][k]f[k][j]s[j]-s[i-1]) 当ij时&#xff0c;f[i][j]0 最终答案&#xff1a;f[1][n] *//* 区间DP…

ESP32 接入点灯科技实现远程控制(物联网)

文章目录 ESP32-C3MQTT协议blinker App 源码blinker 开发者Arduino 支持文档导入 blinker 库注册点灯 APPblinker WiFi 示例blinker 蓝牙示例 本示例中开发板使用的是Seeed Studio (XIAO-ESP32-C3) ESP32-C3 ESP32-C3 是 Espressif Systems 公司开发的一款单核 Wi-Fi 和蓝牙双模…

mysql图形化界面及将mysql注册成后台程序

安装图形化界面版本 右键新建数据库 字符集使用utf8防止以后数据库中存在中文字符导致乱码 将mysql注册成后台程序 cmd进入命令行界面 切换路径到cd /mysql/bin 将mysql注册成后台程序 mysqld.exe --install mysql1 (失败&#xff0c;说明没有权限) 以管理员身份打开成功…

每日5题Day10 - LeetCode 46 - 50

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;46. 全排列 - 力扣&#xff08;LeetCode&#xff09; class Solution {//这道题就是一个dfs//把所有结果遍历&#xff0c;到叶子节点就可以添加结果了List<Int…

忘记“也是一门学问:机器如何忘记自己学到的知识?

在信息时代&#xff0c;我们常常希望人工智能能够学到更多的知识&#xff0c;变得更加智能。但你是否想过&#xff0c;有时候让机器"忘记"一些它学到的东西&#xff0c;也是一件很重要的事&#xff1f; 随着用户隐私保护意识的提高和相关法律法规的出台&#xff0c;…

云端智享——记移动云手写docker-demo

目录 前言什么是移动云&#xff1f;为何我会使用移动云&#xff1f;移动云“好”在哪里&#xff1f;资源大屏显示继续项目部署其他细节 移动云产品的评价未来展望 前言 在如今这个万物都上云的时代&#xff0c;我们需要选择合适的云产品&#xff0c;而移动云有着独特的优势和广…

链表-设计LRU缓存结构

题目描述&#xff1a; 代码实现&#xff1a;这里记录了根据LRU算法原理最直接理解的代码实现。 import java.util.*;//存储输入内容&#xff0c;记录访问权值 class CounterInfo {int key;int value;int times;//代表key对应的权值&#xff0c;值越小优先级越高public Counter…

Android 自定义图片进度条

用系统的Progressbar&#xff0c;设置图片drawable作为进度条会出现图片长度不好控制&#xff0c;容易被截断&#xff0c;或者变形的问题。而我有个需求&#xff0c;使用图片背景&#xff0c;和图片进度&#xff0c;而且在进度条头部有个闪光点效果。 如下图&#xff1a; 找了…

用于时间序列概率预测的蒙特卡洛模拟

大家好&#xff0c;蒙特卡洛模拟是一种广泛应用于各个领域的计算技术&#xff0c;它通过从概率分布中随机抽取大量样本&#xff0c;并对结果进行统计分析&#xff0c;从而模拟复杂系统的行为。这种技术具有很强的适用性&#xff0c;在金融建模、工程设计、物理模拟、运筹优化以…

基于springboot+vue的招聘信息管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

大模型的灵魂解读:Anthropic AI的Claude3 Sonnet可解释性研究

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提供了大模型领域最新技…

【C语言】C语言-设备管理系统(源码+数据文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…