精华内容
下载资源
问答
  • sqlserver 存储过程循环遍历结果集,执行相应操作
    千次阅读
    2019-04-25 11:06:08

    现在有这样一个需求,将A表中的汇总结果,用于更新B表中的字段。

    select count(*) as c,sum(xxx) as s from A where yyy=zzz;

    update B set x=c,y=s where z=zzz;

    A中的汇总结果是有多条,多列的,对应B中也是有多条,多列的,但不是一一对应的关系。

    实现这个需求可以用存储过程。

    1. A表中是以yyy字段作为汇总条件,首选筛选出yyy字段的所有值(去重复)

       select distinct yyy from A;

    2.B表中z字段与A表中的yyy字段是对应的,更新B中的字段需要遍历(select distinct yyy from A)的结果集,以此为更新的条件。

    DECLARE @x INT,@y FLOAT,@zzz nvarchar(255)=''
    	
    	DECLARE rs CURSOR LOCAL SCROLL FOR
        select DISTINCT yyy from A
        OPEN rs
        FETCH NEXT FROM rs INTO @zzz
        WHILE @@FETCH_STATUS = 0
    	BEGIN
    				 						
    		SELECT @x=COUNT(*),@y=SUM(xxx) FROM A where yyy=@zzz;
    		
    		UPDATE B set x=@x,y=@y where z=@zzz;		
    		
    	FETCH NEXT FROM rs INTO @zzz
        END
        CLOSE rs

     

     

    更多相关内容
  • 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;
    
    展开全文
  • 主要介绍了PostgreSQL中调用存储过程并返回数据实例,本文给出一创建数据表、插入测试数据、创建存储过程、调用创建存储过程和运行效果完整例子,需要的朋友可以参考下
  • MySQL存储过程循环遍历查询到的结果集1、创建存储过程(更好的阅读体验,请移步我的个人博客)根据MySQL的语法创建存储过程,要注意的是如果循环遍历查询到的结果集,取出结果集中的数据做操作。CREATE DEFINER=`...

    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'
    
    展开全文
  • BEGIN -- 声明变量 ... /** 声明游标,并将查询结果存到游标中 **/ DECLARE c_borrow CURSOR FOR SELECT ID from rocky_borrow WHERE BORROWTYPE = 2 AND PUBLISH_TIME >= UNIX_TIMESTAMP('2014-
  • 使用navicat创建存储过程 BEGIN #Routine body goes here... DECLARE startTime DATETIME default date_sub(now(),interval 60 MINUTE);#起始时间 当前时间前一小时 DECLARE endTime DATETIME default NOW();...
  • oracle循环结果集

    2020-09-11 11:00:30
    loop循环例子 for item in (select a,b,c from table_a where 条件) loop insert into table_b(a,b,c) values (item.a,item.b,item.c); end loop;
  • 存储过程循环遍历查询结果集 – 创建存储过程之前需判断该存储过程是否已存在,若存在则删除 DROP PROCEDURE IF EXISTS shxc40; – 创建存储过程 CREATE PROCEDURE shxc40() BEGIN – 定义变量 DECLARE s int ...
  • -- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除DROP PROCEDURE IF EXISTS init_reportUrl;-- 创建存储过程CREATE PROCEDURE init_reportUrl()BEGIN-- 定义变量DECLARE s int DEFAULT 0;DECLARE ...
  • 背景: 需要从 shxh40_test 这...-- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除 DROP PROCEDURE IF EXISTS shxc40; -- 创建存储过程 CREATE PROCEDURE shxc40() BEGIN -- 定义变量 DECLARE s int DE
  • -- 定义游标,并将sql结果集赋值到游标中 DECLARE company_list CURSOR FOR SELECT company_id,max_id FROM customer_job WHERE id>1; -- 声明当游标遍历完全部记录后将标志变量置成某个值 DECLARE CONTINUE ...
  • 会对你有不错的帮助,有不足之处还请指教导航: 一、存储过程的创建及调用二 、游标的使用三、 示例四、补充说明:1、用到的两个数据表:from_datato_data2、示例需求 :将表from_data 的select结果集循环插入到表to...
  • //这里的select每循环一次,值就不一样,我想让他作为结果集返 //回应该怎么做 set Str=substring(Str,inext+1); set i=i+1; select Str,ind,inext,len,unit; end; end if; end; end if; end; set ind=inext+1; end...
  • mysql创建存储过程(不使用工具创建) use test; -- test:数据库名。 进入test数据库 DROP PROCEDURE IF EXISTS user; -- synchron_user:存储过程名。 存在synchron_user存储过程,则删除 delimiter // -- mysql语句...
  • Oracle存储过程遍历结果集

    千次阅读 2018-02-08 11:41:00
    --循环遍历结果集 id 直到为空时退出循环 fetch user_id into r_userid; EXIT WHEN r_userid%NOTFOUND; --执行需要插入的语句 insert into UserPR values (r_userid,'test'); goto loop_block; END LOOP; END...
  • 基本上,我想在MySQL中循环一个结果.SELECT col1 FROM table1; < ---(1)从此查询中获取结果.LOOP THROUGH col1ResultSELECT myCol FROM table2 WHERE thisCol = col1Result< ---等于上一个查询的每个结果.END ...
  • SQL Server 存储过程 循环遍历结果集

    万次阅读 2013-09-22 15:35:29
    --如果记录存在,进入循环 IF(@pid is not null and @pid != 0) BEGIN set @total = 0; DECLARE vend_cursor CURSOR FOR SELECT tbTask.AlreadyPercent,tbTask.Percents FROM tbTask where tbTask....
  • DB2 存储过程返回结果集

    千次阅读 2018-05-14 21:26:21
    存储过程返回结果集,但是并未明确定义out参数的情况下,要正确获取到结果集,则必须明确设置返回结果集个数:result set 结果集个数如果没有声明返回结果集个数,那么存储过程中定义的游标是获取不到其值的1:创建...
  • 存储过程插入数据 DROP PROCEDURE IF EXISTS inst_data; CREATE PROCEDURE inst_data() BEGIN DECLARE incr INT DEFAULT 1; WHILE incr (`NAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY` ) VALUES ( ...
  • -- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除 DROP PROCEDURE IF EXISTS batch_data; -- 创建存储过程 CREATE PROCEDURE batch_data() BEGIN -- 定义变量 DECLARE i INT DEFAULT 0; DECLARE s ...
  • mysql 存储过程 查询结果集循环处理游标使用 注意每个版本的mysq的存储过程,触发器写法都会有些许区别,注意查看官方版本,不然你网上copy的语句可能执行无效,或者不成功 官方英文说明文档 ...
  • 最近有个需求,要批量创建一批数据,但要以另一张表筛选出的结果集作为条件,逻辑很简单,只是需要用到存储过程,之前都没用过,所以写篇文章记录下,下面的代码可以作为示例。 ##创建存储过程之前需判断该存储...
  • 工作中遇到数据库迁移问题,需要先查询出一张表的ID,然后添加到另外的三方表里面,所以写了这个存储过程,在此做笔记。 DROP PROCEDURE IF EXISTS useCursor; delimiter // /*建立 存储过程 create */ CREATE ...
  • 写了一个存储过程CREATE DEFINER=`root`@`%` PROCEDURE `api`(product_id varchar(255))BEGINDECLARE p_sql varchar(500);DECLARE p_type varchar(100);DECLARE ct INT DEFAULT 0;DECLARE content_count INT;SELECT ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 175,526
精华内容 70,210
关键字:

存储过程循环结果集

友情链接: LEDSET.rar