精华内容
下载资源
问答
  • 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()

    更多相关内容
  • 2:使用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'
    
    展开全文
  • -- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除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()

    ---------------------

    展开全文
  • CREATE 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实现创建存储过程循环添加记录的方法,涉及基本的mysql存储过程创建、调用相关操作技巧,需要的朋友可以参考下
  • ORACLE 存储过程循环依次查询插入 ORACLE 存储过程循环依次查询插入 刚入门oracle不久,最近有个测试的小任务,场景是模拟用户上线记录:查询用户表,然后将部分数据插入在线表中,插入一次commit一次。 先上代码: ...
  • -- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除 DROP PROCEDURE IF EXISTS batch_data; -- 创建存储过程 CREATE PROCEDURE batch_data() BEGIN -- 定义变量 DECLARE i INT DEFAULT 0; DECLARE s ...
  • BEGIN -- 声明变量 ... /** 声明游标,并将查询结果存到游标中 **/ DECLARE c_borrow CURSOR FOR SELECT ID from rocky_borrow WHERE BORROWTYPE = 2 AND PUBLISH_TIME >= UNIX_TIMESTAMP('2014-
  • 存储过程循环遍历查询结果集 – 创建存储过程之前需判断该存储过程是否已存在,若存在则删除 DROP PROCEDURE IF EXISTS shxc40; – 创建存储过程 CREATE PROCEDURE shxc40() BEGIN – 定义变量 DECLARE s int ...
  • mysql 存储过程 查询结果循环插入

    千次阅读 2022-01-24 11:59:38
    DELIMITER // CREATE PROCEDURE _inertDepartment_corpid() #这个是存储过程名称 随便起; BEGIN ##定义从A表里面取的值;这个是单条记录的corpid的值 DECLARE _corpid varchar(50); #需要插入表内存在同样值...
  • 使用for loop向表中批量插入数据,推荐使用plsql执行,Dbvisualizer语句执行会出错
  • 本文实例讲述了MySQL存储过程中使用WHILE循环语句的方法。分享给大家供大家参考。具体如下: mysql> mysql> delimiter $$ mysql> mysql> CREATE PROCEDURE myProc() -> BEGIN -> -> DECLARE i int; -> SET i=1;...
  • FOR循环用法 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 -...
  • CREATE DEFINER=`ceshi`@`%` PROCEDURE `A1_test`( ) BEGIN -- 创建计数器 ...-- 从用户表中查询出voucherurl1, user叫游标 DECLARE user CURSOR FOR select voucherurl1 from paymentsign_copy1 where dgor
  • 背景:需要从shxh40_test 这张表 获取 upperpolicyno,serialno,kindcode,...-- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除DROP PROCEDURE IF EXISTS shxc40;-- 创建存储过程CREATE PROCEDUR...
  • 主要介绍了循环和游标在Sql存储过程中使用及sql如何使用cursor写一个简单的循环的相关资料,需要的朋友可以参考下
  • 基本上,我想在MySQL中循环一个结果.SELECT col1 FROM table1; < ---(1)从此查询中获取结果.LOOP THROUGH col1ResultSELECT myCol FROM table2 WHERE thisCol = col1Result< ---等于上一个查询的每个结果.END ...
  • 主要介绍了Oracle存储过程循环语法,结合实例形式分析了Oracle基本的while、for循环使用方法,具有一定参考借鉴价值,需要的朋友可以参考下
  • 使用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存储过程 循环表操作 使用游标
  • -- 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 ...
  • 如下存储过程使用游标遍历所有数据: 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存储过程的认识与了解,这里主要说说大家常用的游标加循环的嵌套使用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 620,838
精华内容 248,335
关键字:

存储过程循环查询结果