-
2021-03-03 20:25:34
MySQL存储过程-循环遍历查询到的结果集
1、创建存储过程
根据MySQL的语法创建存储过程,要注意的是如果循环遍历查询到的结果集,取出结果集中的数据做操作。
CREATE DEFINER=`root`@`%` PROCEDURE `alter_view_counts`()
BEGIN
#声明结束标识
DECLARE end_flag int DEFAULT 0;
DECLARE albumId bigint;
#声明游标 album_curosr
DECLARE album_curosr CURSOR FOR SELECT album_id FROM album;
#设置终止标志
DECLARE CONTINUE HANDLER FOR NOT FOUND SET end_flag=1;
#打开游标
OPEN album_curosr;
#遍历游标
REPEAT
#获取当前游标指针记录,取出值赋给自定义的变量
FETCH album_curosr INTO albumId;
#利用取到的值进行数据库的操作
UPDATE album SET album.views_count= (SELECT SUM(light_chat.views_count) FROM `light_chat` WHERE light_chat.album_id = albumId) WHERE album.album_id = albumId;
# 根据 end_flag 判断是否结束
UNTIL end_flag END REPEAT;
#关闭游标
close album_curosr;
END
2,调用存储过程
CALL alter_view_counts()
更多相关内容 -
MySQL存储过程之循环遍历查询的结果集
2021-12-18 18:27:352:使用MySQL的存储过程 若使用第一种办法的话,需要重新发布版本,比较麻烦,再加上领导对发布版本有些抵触,我觉得我们还是使用第二种方式比较快捷。 1. 表结构 测试表结构如下: CREATE TABLE `member_album` ( ...前言:
近来碰到这样一个问题:在生产上导入的数据发现会员的相册数量统计结果与相册中实际的数量不一致的问题。
解决这个问题有两种办法:
1:使用程序修正数量不一致的问题
2:使用MySQL的存储过程若使用第一种办法的话,需要重新发布版本,比较麻烦,再加上领导对发布版本有些抵触,我觉得我们还是使用第二种方式比较快捷。
1. 表结构
测试表结构如下:
CREATE TABLE `member_album` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '数据ID', `member_id` int(11) DEFAULT NULL COMMENT '会员ID', `file_type` varchar(8) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文件类型(image:照片;video:视频)', `file_id` int(11) DEFAULT NULL COMMENT '文件ID', `file_path` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文件地址(相对地址)', `create_date` datetime DEFAULT NULL COMMENT '创建时间', `del_flag` tinyint(1) DEFAULT '0' COMMENT '删除标识(0:正常;1:已删除)', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会员相册';
CREATE TABLE `member_album_count` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '数据ID', `member_id` int(11) DEFAULT NULL COMMENT '会员ID', `img_pass_count` int(11) DEFAULT '0' COMMENT '照片通过的数量', `img_verify_count` int(11) DEFAULT '0' COMMENT '照片审核中的数量', `img_fail_count` int(11) DEFAULT '0' COMMENT '照片未通过的数量', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会员照片数量表';
测试表数据如下:
会员相册表:
会员相册数量表:
很明显,会员相册数量表中的数据是不对的,例如会员ID为10024的照片有3张,而在会员相册数量表中显示的是0张。2. 存储过程
-- 建立存储过程之前需要判断该存储过程是否存在,若存在则删除 DROP PROCEDURE IF EXISTS update_album_count; -- 创建存储过程,update_album_count为存储过程名 CREATE PROCEDURE update_album_count() -- 标识存储过程开始 BEGIN -- 定义变量 DECLARE s int DEFAULT 0; DECLARE memberId int; DECLARE count int; -- 定义游标,并将sql结果集赋值到游标中,report为游标名 DECLARE report CURSOR FOR SELECT member_id, COUNT(member_id) FROM member_album GROUP BY member_id HAVING COUNT(member_id) > 0 ORDER BY member_id ASC; -- 声明当游标遍历完后将标志变量置为某个值 DECLARE CONTINUE HANDLER FOR NOT FOUND SET s = 1; -- 打开游标 OPEN report; -- 将游标中的值赋值给变量,注意:变量名不要与sql返回的列名相同,变量顺序要和sql结果列的顺序一致 FETCH report INTO memberId, count; -- 当s不等于1时,也就是未遍历完时,会一直循环 WHILE s <> 1 DO -- 执行业务逻辑 UPDATE member_album_count t SET t.img_pass_count = count WHERE t.member_id = memberId; -- 当s等于1时代表遍历已完成,退出循环 FETCH report INTO memberId, count; END WHILE; -- 关闭游标 CLOSE report; -- 标识存储过程结束 END;
执行存储过程:
CALL update_album_count();
此时再来看会员相册数量表数据:
已经正常了!!!3. 关于存储过程的SQL补充
-- 显示存储过程的状态 show procedure status; -- 查询指定数据库的存储过程名称 select `name` from mysql.proc where db = 'your_db_name' and `type` = 'PROCEDURE'
-
mysql存储过程之循环遍历查询结果集
2021-01-25 11:50:09-- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除DROP PROCEDURE IF EXISTS init_reportUrl;-- 创建存储过程CREATE PROCEDURE init_reportUrl()BEGIN-- 定义变量DECLARE s int DEFAULT 0;DECLARE ...-- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除
DROP PROCEDURE IF EXISTS init_reportUrl;
-- 创建存储过程
CREATE PROCEDURE init_reportUrl()
BEGIN
-- 定义变量
DECLARE s int DEFAULT 0;
DECLARE report_id varchar(255);
DECLARE report_url varchar(256);
-- 定义游标,并将sql结果集赋值到游标中
DECLARE report CURSOR FOR select reportId,reportUrl from patrolReportHistory;
-- 声明当游标遍历完后将标志变量置成某个值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
-- 打开游标
open report;
-- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和sql结果列的顺序一致
fetch report into report_id,report_url;
-- 当s不等于1,也就是未遍历完时,会一直循环
while s<>1 do
-- 执行业务逻辑
update patrolreporthistory set reportUrl = CONCAT(‘patrolReport.html?monitorId=‘,substring(report_url,15,1),‘&reportId=‘,report_id) where reportId=report_id;
-- 将游标中的值再赋值给变量,供下次循环使用
fetch report into report_id,report_url;
-- 当s等于1时表明遍历以完成,退出循环
end while;
-- 关闭游标
close report;
END;
-- 执行存储过程
call init_reportUrl()
---------------------
-
oracle存储过程循环结果集
2021-08-17 11:51:18CREATE OR REPLACE PROCEDURE FWBZ_CUNSTOM_REMAIN_HALF is --声明变量 DECLARE s int DEFAULT 0; ttNumber varchar2(100); ttId varchar2(100); createTime date;... astatus varchar2(20);...CREATE OR REPLACE PROCEDURE FWBZ_CUNSTOM_REMAIN_HALF is --声明变量 ttNumber varchar2(100); ttId varchar2(100); ttType varchar2(50); createTime date; astatus varchar2(20); repariTimeLimit Number(32); hangUpTime Number(32); --挂起时长(分为单位) flowId varchar2(64); receivePeople varchar2(64); receiveDept varchar2(64); parentId varchar2(100); hangBeginTime date; --挂起开始时间 begin for item in ( select a.TT_NUMBER,a.tt_id,a.OSS_CREATE_TIME,a.STATUS,a.REPAIRTIMELIMIT,a.HANGUPTIME,a.TT_TYPE,a.HANGBEGINTIME, b.FLOW_ID,b.RECEIVER,b.RECEIVE_DEPT,b.PARENT_ID from t_trouble_ticket_new a, t_trouble_flow b where a.tt_id = b.tt_id and a.tt_type<>'感知' and a.tt_source not in() and a.TT_TYPE IN (SELECT TT_TYPE FROM T_TROUBLE_TT_TYPE) and b.STATUS in ('待处理','已处理','处理中') and a.PARENT_TTID is null and a.TT_NUMBER not in (select tt_number from T_CUSTOM_REMIND)) loop --赋值 ttNumber := item.tt_number; ttId := item.tt_id; ttType := item.TT_TYPE; createTime := item.OSS_CREATE_TIME; astatus := item.STATUS; repariTimeLimit := item.REPAIRTIMELIMIT; hangUpTime := item.HANGUPTIME; flowId := item.FLOW_ID; receivePeople := item.RECEIVER; receiveDept := item.RECEIVE_DEPT; hangBeginTime := item.tt_id; parentId := item.PARENT_ID; --判断是否 已挂起 if repariTimeLimit is not null then if astatus <> '已挂起' --时间过半 现在时间-创建时间(OSS_CREATE_TIME)-挂起时长(HANGUPTIME) then if (sysdate - createTime - hangUpTime) > repariTimeLimit/2 --时间过半 then --插入提醒表 insert into t_info_prompt (ID,FLOW_ID,TT_ID,TT_NUMBER,CONTENT,DEPARTMENT,TYPE,CREATETIME,RECEIVER,TT_TYPE) values ('I'||SEQ_TT_ID.NEXTVAL,flowId,ttId,ttNumber,'历时过半,请注意历时。', receiveDept,'历时过半提醒',sysdate,receivePeople,ttType); --插入操作表 insert into t_operation_info_new (ID,TT_ID,FLOW_ID,PARENT_ID,TT_NUMBER,OPERATION,OPERATIONINFO,OPERATOR,DEPARTMENT,OPERATETIME,WORK_NUMBER,ISAUTO) values ('PP'||seq_tt_id.nextval,ttId,flowId,parentId,ttNumber,'自动催单','请尽快反馈处理进度', '智能管控助手','system',sysdate,'bj_Auto','1'); --插入记录表 insert into T_CUSTOM_REMIND (TT_NUMBER,STATUS,REMIND_TIME) values (ttNumber,'时间过半提醒',sysdate); elsif (sysdate - createTime - hangUpTime) > repariTimeLimit --超时 then --插入提醒表 insert into t_info_prompt (ID,FLOW_ID,TT_ID,TT_NUMBER,CONTENT,DEPARTMENT,TYPE,CREATETIME,RECEIVER,TT_TYPE) values ('I'||SEQ_TT_ID.NEXTVAL,flowId,ttId,ttNumber,'历时过半,请注意历时。', receiveDept,'历时过半提醒',sysdate,receivePeople,ttType); --插入操作表 insert into t_operation_info_new (ID,TT_ID,FLOW_ID,PARENT_ID,TT_NUMBER,OPERATION,OPERATIONINFO,OPERATOR,DEPARTMENT,OPERATETIME,WORK_NUMBER,ISAUTO) values ('PP' || seq_tt_id.nextval,ttId,flowId,parentId,ttNumber,'自动催单','请尽快反馈处理进度', '智能管控助手','system',sysdate,'bj_Auto','1'); --插入记录表 insert into T_CUSTOM_REMIND (TT_NUMBER,STATUS,REMIND_TIME) values (ttNumber,'时间过半提醒',sysdate); end if; elsif astatus = '已挂起' then if (hangBeginTime - createTime - hangUpTime) > repariTimeLimit/2 --时间过半 then --插入提醒表 insert into t_info_prompt (ID,FLOW_ID,TT_ID,TT_NUMBER,CONTENT,DEPARTMENT,TYPE,CREATETIME,RECEIVER,TT_TYPE) values ('I'||SEQ_TT_ID.NEXTVAL,flowId,ttId,ttNumber,'历时过半,请注意历时。', receiveDept,'历时过半提醒',sysdate,receivePeople,ttType); --插入操作表 insert into t_operation_info_new (ID,TT_ID,FLOW_ID,PARENT_ID,TT_NUMBER,OPERATION,OPERATIONINFO,OPERATOR,DEPARTMENT,OPERATETIME,WORK_NUMBER,ISAUTO) values ('PP' || seq_tt_id.nextval,ttId,flowId,parentId,ttNumber,'自动催单','请尽快反馈处理进度', '智能管控助手','system',sysdate,'bj_Auto','1'); --插入记录表 insert into T_CUSTOM_REMIND (TT_NUMBER,STATUS,REMIND_TIME) values (ttNumber,'时间过半提醒',sysdate); elsif (hangBeginTime - createTime - hangUpTime) > repariTimeLimit --超时 then --插入提醒表 insert into t_info_prompt (ID,FLOW_ID,TT_ID,TT_NUMBER,CONTENT,DEPARTMENT,TYPE,CREATETIME,RECEIVER,TT_TYPE) values ('I'||SEQ_TT_ID.NEXTVAL,flowId,ttId,ttNumber,'历时过半,请注意历时。', receiveDept,'历时过半提醒',sysdate,receivePeople,ttType); --插入操作表 insert into t_operation_info_new (ID,TT_ID,FLOW_ID,PARENT_ID,TT_NUMBER,OPERATION,OPERATIONINFO,OPERATOR,DEPARTMENT,OPERATETIME,WORK_NUMBER,ISAUTO) values ('PP' || seq_tt_id.nextval ,ttId,flowId,parentId,ttNumber,'自动催单','请尽快反馈处理进度', '智能管控助手','system',sysdate,'bj_Auto','1'); --插入记录表 insert into T_CUSTOM_REMIND (TT_NUMBER,STATUS,REMIND_TIME) values (ttNumber,'时间过半提醒',sysdate); end if; end if; end if; end loop; END;
-
MySQL实现创建存储过程并循环添加记录的方法
2020-09-09 16:35:36主要介绍了MySQL实现创建存储过程并循环添加记录的方法,涉及基本的mysql存储过程创建、调用相关操作技巧,需要的朋友可以参考下 -
ORACLE 存储过程循环依次查询插入
2021-07-15 10:32:49ORACLE 存储过程循环依次查询插入 ORACLE 存储过程循环依次查询插入 刚入门oracle不久,最近有个测试的小任务,场景是模拟用户上线记录:查询用户表,然后将部分数据插入在线表中,插入一次commit一次。 先上代码: ... -
MySql存储过程,循环遍历查询结果集,并执行相关逻辑
2021-11-30 16:37:18-- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除 DROP PROCEDURE IF EXISTS batch_data; -- 创建存储过程 CREATE PROCEDURE batch_data() BEGIN -- 定义变量 DECLARE i INT DEFAULT 0; DECLARE s ... -
Mysql存储过程循环内嵌套使用游标示例代码
2021-01-19 22:27:27BEGIN -- 声明变量 ... /** 声明游标,并将查询结果存到游标中 **/ DECLARE c_borrow CURSOR FOR SELECT ID from rocky_borrow WHERE BORROWTYPE = 2 AND PUBLISH_TIME >= UNIX_TIMESTAMP('2014- -
存储过程之循环遍历查询结果集
2021-09-07 17:15:02存储过程之循环遍历查询结果集 – 创建存储过程之前需判断该存储过程是否已存在,若存在则删除 DROP PROCEDURE IF EXISTS shxc40; – 创建存储过程 CREATE PROCEDURE shxc40() BEGIN – 定义变量 DECLARE s int ... -
mysql 存储过程 查询结果循环插入
2022-01-24 11:59:38DELIMITER // CREATE PROCEDURE _inertDepartment_corpid() #这个是存储过程名称 随便起; BEGIN ##定义从A表里面取的值;这个是单条记录的corpid的值 DECLARE _corpid varchar(50); #需要插入表内存在同样值... -
存储过程(循环插入数据)
2020-09-24 15:36:40使用for loop向表中批量插入数据,推荐使用plsql执行,Dbvisualizer语句执行会出错 -
MySQL存储过程中使用WHILE循环语句的方法
2020-12-15 13:03:32本文实例讲述了MySQL存储过程中使用WHILE循环语句的方法。分享给大家供大家参考。具体如下: mysql> mysql> delimiter $$ mysql> mysql> CREATE PROCEDURE myProc() -> BEGIN -> -> DECLARE i int; -> SET i=1;... -
ORACLE存储过程循环等操作
2021-06-04 11:48:03FOR循环用法 create or replace procedure P_AUTO_INSERT_USER_ROLE(EXEC_DATE IN DATE) is /** * 根据查到的数据循环遍历 */ begin DECLARE V_START_DATE VARCHAR2(30); V_END_DATE VARCHAR2(30); begin -... -
mysql 存储过程游标 循环输出select 查询结果
2020-12-08 19:14:33CREATE DEFINER=`ceshi`@`%` PROCEDURE `A1_test`( ) BEGIN -- 创建计数器 ...-- 从用户表中查询出voucherurl1, user叫游标 DECLARE user CURSOR FOR select voucherurl1 from paymentsign_copy1 where dgor -
MySql--存储过程之循环遍历查询结果集
2021-01-18 18:32:37背景:需要从shxh40_test 这张表 获取 upperpolicyno,serialno,kindcode,...-- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除DROP PROCEDURE IF EXISTS shxc40;-- 创建存储过程CREATE PROCEDUR... -
Sql存储过程游标循环的用法及sql如何使用cursor写一个简单的循环
2020-09-10 06:25:08主要介绍了循环和游标在Sql存储过程中使用及sql如何使用cursor写一个简单的循环的相关资料,需要的朋友可以参考下 -
(MySQL)存储过程 – 循环结果
2021-01-19 09:17:12基本上,我想在MySQL中循环一个结果.SELECT col1 FROM table1; < ---(1)从此查询中获取结果.LOOP THROUGH col1ResultSELECT myCol FROM table2 WHERE thisCol = col1Result< ---等于上一个查询的每个结果.END ... -
Oracle存储过程循环语法实例分析
2020-09-10 02:20:07主要介绍了Oracle存储过程循环语法,结合实例形式分析了Oracle基本的while、for循环使用方法,具有一定参考借鉴价值,需要的朋友可以参考下 -
MySQL存储过程创建实例,双循环结果集并定时执行
2021-01-19 21:55:00使用navicat创建存储过程 BEGIN #Routine body goes here... DECLARE startTime DATETIME default date_sub(now(),interval 60 MINUTE);#起始时间 当前时间前一小时 DECLARE endTime DATETIME default NOW();... -
mysql存储过程循环表
2016-12-15 15:20:14一个简单易理解的mysql存储过程 循环表操作 使用游标 -
mysql存储过程循环遍历sql结果集,并执行动态sql
2018-06-09 19:58:05-- while循环 WHILE num <> 1 DO -- 动态拼接sql并赋值v_sql_1 SET v_sql_1 = CONCAT('select max(id) into @param1 from customer',companyId); -- 需要用@转换下,直接v_sql_1执行不了 SET @sql_1 ... -
SQL工作笔记-达梦7存储过程中游标的使用(for循环 IF等)
2020-12-14 11:29:28如下存储过程使用游标遍历所有数据: CREATE OR REPLACE PROCEDURE "CFFTEST"."SELECT_STUDENT"("id" IN INT) AS myId int; myName varchar(50); cursor myCursor is select id, name from cfftest.student; ... -
mysql存储过程 游标 循环使用介绍
2020-09-11 00:01:45今天分享下自己对于Mysql存储过程的认识与了解,这里主要说说大家常用的游标加循环的嵌套使用