精华内容
下载资源
问答
  • mysql存储过程 游标 查询结果循环

    千次阅读 2015-09-02 14:38:05
    Mysql的存储过程是从版本5才开始支持的,所以目前一般使用的都可以用到存储过程。今天分享下自己对于Mysql存储过程的认识与了解。 一些简单的调用以及语法规则这里就不在赘述,网上有许多例子。这里主要说说大家...

    转自:http://blog.sina.com.cn/s/blog_a3c770670101clia.html

    Mysql的存储过程是从版本5才开始支持的,所以目前一般使用的都可以用到存储过程。今天分享下自己对于Mysql存储过程的认识与了解。

    一些简单的调用以及语法规则这里就不在赘述,网上有许多例子。这里主要说说大家常用的游标加循环的嵌套使用。

    首先先介绍循环的分类:

    (1)WHILE ... END WHILE  
    (2)LOOP ... END LOOP  
    (3)REPEAT ... END REPEAT  
    (4)GOTO  
    这里有三种标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环。还有一种非标准的循环方式:GOTO(不做介绍)。 
     
    (1)WHILE ... END WHILE   
    CREATE PROCEDURE p14()  
    BEGIN  
      DECLARE v INT;  
      SET v = 0;  
      WHILE v < 5 DO  
        INSERT INTO t VALUES (v);  
        SET v = v + 1;  
      END WHILE;  
    END;  
    这是WHILE循环的方式。它跟IF语句相似,使用"SET v = 0;"语句使为了防止一个常见的错误,如果没有初始化,默认变量值为NULL,而NULL和任何值操作结果都为NULL。


    (2)REPEAT ... END REPEAT    
    CREATE PROCEDURE p15 ()  
    BEGIN  
      DECLARE v INT;  
      SET v = 0;  
      REPEAT  
        INSERT INTO t VALUES (v);  
        SET v = v + 1;  
        UNTIL v >= 5  
      END REPEAT;  
    END;  
    这是REPEAT循环的例子,功能和前面WHILE循环一样。区别在于它在执行后检查结果,而WHILE则是执行前检查。类似于do while语句。注意到UNTIL语句后面没有分号,在这里可以不写分号,当然你加上额外的分号更好。 
     
    (3)LOOP ... END LOOP    
    CREATE PROCEDURE p16 ()  
    BEGIN  
      DECLARE v INT;  
      SET v = 0;  
      loop_label: LOOP  
        INSERT INTO t VALUES (v);  
        SET v = v + 1;  
        IF v >= 5 THEN  
          LEAVE loop_label;  
        END IF;  
      END LOOP;  
    END; 
    以上是LOOP循环的例子。LOOP循环不需要初始条件,这点和WHILE循环相似,同时它又和REPEAT循环一样也不需要结束条件。 


    ITERATE 迭代
     
    如果目标是ITERATE(迭代)语句的话,就必须用到LEAVE语句 
     
    CREATE PROCEDURE p20 ()  
    BEGIN  
      DECLARE v INT;  
      SET v = 0;  
      loop_label: LOOP  
        IF v = 3 THEN  
          SET v = v + 1;  
          ITERATE loop_label;  
          END IF;  
        INSERT INTO t VALUES (v);  
        SET v = v + 1;  
        IF v >= 5 THEN   
          LEAVE loop_label;  
          END IF;  
        END LOOP;  
    END;
    ITERATE(迭代)语句和LEAVE语句一样也是在循环内部的循环引用, 它有点像C语言中 的“Continue”,同样它可以出现在复合语句中,引用复合语句标号,ITERATE(迭代)意思 是重新开始复合语句。 


    以上是对于循环的几种情况的介绍。接着就是介绍一个带游标的例子来详细解释。

    begin

    declare p_feeCode varchar(20);
    declare p_feeName varchar(20);
    declare p_billMoney float(12);
    declare p_schemeMoney float(12);
    declare allMoney float(10);
    declare allUsedMoney float(10);
    declare p_year varchar(50);
    declare p_totalCompeleteRate float(12);
    declare done int(10);
      declare flag int(2);
    declare feeCodeCursor cursor for select feeCode from fee;//申明一个游标变量
    declare continue handler for not found set done=1;//申明循环结束的标志位

    set done=0;
    select date_format(now(),'%Y') into p_year;

    open feeCodeCursor;//打开游标
    loop_label:LOOP
    fetch feeCodeCursor into p_feeCode;//将游标插入申明的变量
    if done = 1 then
    leave loop_label;
    else
    set flag = 0;
    end if;
    set p_schemeMoney=0;
    set p_billMoney = 0;
    select feeName into p_feeName from fee where feeCode=p_feeCode;
    select sum(billMoney) into p_billMoney from bill_data where feeCode=p_feeCode and billDate like Concat(p_year, '%');
    select schemeMoney into p_schemeMoney from total_scheme where feeCode=p_feeCode and schemeDate like Concat(p_year, '%')  limit 1;
    if flag = 0 then
    set done = 0;
    end if;
    if p_schemeMoney=0 then
    set p_totalCompeleteRate=-1.0;
    else
    set p_totalCompeleteRate=(1.0*p_billMoney)/p_schemeMoney;
    end if;
    insert into total_summary values(p_feeCode,p_feeName,p_year,p_billMoney,p_totalCompeleteRate);
    commit;
    end LOOP;
    close feeCodeCursor;//循环结束后需要关闭游标

    end

    以上只是一个简单的例子来说明如何使用,大家不需要关注具体业务逻辑,只需要关注的是其中标志位值的修改情况,已经循环何时离开。以及游标如何声明,如何使用,至于里面具体的操作和普通的sql语句没有太大区别。此处是用一层循环,至于复杂业务需要需要两层三层,可以继续用同样的方法继续嵌套。以下给出双层嵌套循环的,同样大家只需要关注嵌套结构即可。

    begin
    declare p_projectID varchar(20);
    declare p_projectName varchar(20);
    declare p_feeCode varchar(20);
    declare p_feeName varchar(20);
    declare p_projectSchemeMoney float(10);
    declare p_projectMoney float(10);
    declare p_billMoney float(10);
    declare p_year varchar(50);
    declare p_projectFeeCompeleteRate float(10);
    declare done1 int(10);
    declare done2 int(10);
    declare flag int(2);
    declare feeCodeCursor cursor for select feeCode from fee;
    declare continue handler for not found set done1=1;

    set done1=0;
    select date_format(now(),'%Y') into p_year;
    delete from project_fee_summary;
    open feeCodeCursor;


    repeat //第一层嵌套开始
    fetch feeCodeCursor into p_feeCode;
    select feeName into p_feeName from fee where feeCode=p_feeCode;
    if not done1 then
    begin
    declare projectIDCursor cursor for select projectID from project;
    declare continue handler for not found set done2 = 1;
    set done2=0;
    open projectIDCursor;
    loop_label:LOOP//第二层嵌套开始
    fetch projectIDCursor into p_projectID;
    select projectName into p_projectName from project where projectID=p_projectID;
    if done2 = 1 then
    leave loop_label;
    else
    set flag = 0;
    end if;
    if not done2 then
    set p_projectSchemeMoney=0;
    select sum(billMoney) into p_billMoney from bill_data where feeCode=p_feeCode and projectID=p_projectID and billDate like Concat(p_year, '%');
    select projectSchemeMoney into p_projectSchemeMoney from project_scheme where feeCode=p_feeCode and projectID=p_projectID;
    if flag = 0 then
    set done2 = 0;
    end if;
    if p_projectSchemeMoney=0 then
    set p_projectFeeCompeleteRate=-1;
    else
    set p_projectFeeCompeleteRate=(1.0*p_billMoney)/p_projectSchemeMoney;
    end if;
    insert into project_fee_summary values(p_feeCode,p_projectID,p_projectName,p_feeName,p_year,p_billMoney,p_projectFeeCompeleteRate,p_projectFeeCompeleteRate);
    end if;
    end LOOP;
    select sum(billMoney) into p_projectMoney from bill_data where feeCode=p_feeCode and billDate like Concat(p_year, '%');
    set p_projectFeeCompeleteRate=(1.0*p_projectMoney)/p_projectSchemeMoney;
    insert into project_fee_summary values(p_feeCode,"total","total",p_feeName,p_year,p_projectMoney,p_projectFeeCompeleteRate,p_projectFeeCompeleteRate);
    close projectIDCursor;
    end;
    end if;
    until done1 
    end repeat;
    close feeCodeCursor;
    end


    展开全文
  • mysql存储过程循环遍历查询结果

    万次阅读 多人点赞 2019-07-31 19:37:33
    -- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除 DROP PROCEDURE IF EXISTS init_reportUrl; -- 创建存储过程 CREATE PROCEDURE init_reportUrl() BEGIN -- 定义变量 DECLARE s int DEFAULT 0; ...
    -- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除
    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()

     

    展开全文
  • MySQL存储过程循环遍历查询到的结果集 1、创建存储过程 根据MySQL的语法创建存储过程,要注意的是如果循环遍历查询到的结果集,取出结果集中的数据做操作。 CREATE DEFINER=`root`@`%` PROCEDURE `alte...

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

     

    展开全文
  • 背景:  需要从shxh40_test 这张表 获取 upperpolicyno,serialno,kindcode,oldregistno,uniqueno 这几个...-- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除 DROP PROCEDURE IF EXISTS shxc40; ...

     

     

    背景:

      需要从  shxh40_test 这张表  获取   upperpolicyno,serialno,kindcode,oldregistno,uniqueno 这几个字段(得到集合),然后循环 取值,写sql 更新数据。

     

     

    -- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除
    DROP PROCEDURE IF EXISTS shxc40; 
    -- 创建存储过程
    CREATE PROCEDURE shxc40()
    BEGIN
    	
    -- 定义变量
    	DECLARE s int DEFAULT 0;
    	DECLARE p varchar(255);
    	DECLARE s1 varchar(255);
    	DECLARE k varchar(256);
    	DECLARE r varchar(256);
    	DECLARE u varchar(256);
    
    	-- 定义游标,并将sql结果集赋值到游标中
    	DECLARE report CURSOR FOR select upperpolicyno,serialno,kindcode,oldregistno,uniqueno from shxh40_test;
    
    	-- 声明当游标遍历完后将标志变量置成某个值
    	DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
    
    	-- 打开游标
    	open report;
    
    		-- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和sql结果列的顺序一致
    		fetch report into p,s1,k,r,u;
    
    		-- 当s不等于1,也就是未遍历完时,会一直循环
    		while s<>1 do
    			
    			-- 执行业务逻辑
    			UPDATE icp_claim_info_shxh40 info,icp_engage_shxh40 engage set info.oldregistno = r, info.uniqueno = u
    			where info.registno = engage.registno 
          and info.sourceflag = '34' 
    			and info.endcasedate = '2019-07-15'
    			and info.upperpolicyno =p
    			and engage.serialno = s1
    			and engage.kindcode = k
    			and oldregistno is null;
    
    			-- 当s等于1时表明遍历以完成,退出循环
    			fetch report into p,s1,k,r,u;
    		end while;
    	-- 关闭游标
    	close report;
    END;
    

      

     

    -- 执行存储过程
    call shxc40()

     

    转载于:https://www.cnblogs.com/llq1214/p/11202743.html

    展开全文
  • 现在有这样一个需求,将A表中的汇总结果,用于更新B表中的字段。 select count(*) as c,sum(xxx) as s from A where yyy=zzz; update B set x=c,y=s ...实现这个需求可以用存储过程。 1. A表中是以yyy字段作为...
  • CREATE DEFINER=`ceshi`@`%` PROCEDURE `A1_test`( ) BEGIN -- 创建计数器 ...-- 从用户表中查询出voucherurl1, user叫游标 DECLARE user CURSOR FOR select voucherurl1 from paymentsign_copy1 where dgor
  • mysql存储过程查询结果循环遍历 判断 赋值 游标等基本操作 一、首先说下本篇博客所实现功能的背景和功能是怎样的:  背景:因为公司项目开始迁移新平台项目,所以以前的平台老数据以及订单信息需要拆分表,而且...
  • Mysql存储过程--循环查询

    千次阅读 2017-12-25 17:12:34
    MySQL有循环语句操作,while 循环、loop循环和repeat循环 mysql 操作同样有循环语句操作,网上说有3中标准的循环方式: while 循环 、 loop 循环和repeat循环。还有一种非标准的循环: goto。 鉴于goto 语句的跳跃...
  • 如果使用 SYS.ALL_TABLES查询的话查出的不是实时记录数。因为Oracle不实时收集统计信息 SELECT SUM(num_rows) FROM SYS.ALL_...所以我们可以采用存储过程的方式来进行循环查询 create or replace procedure...
  • 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....
  • 最近有个需求,要批量创建一批数据,但要以另一张表筛选出的结果集作为条件,逻辑很简单,只是需要用到存储过程,之前都没用过,所以写篇文章记录下,下面的代码可以作为示例。 ##创建存储过程之前需判断该存储...
  • 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 ...
  • 1.话不多说 BEGIN #Routine body goes here... #定义 变量 DECLARE a int; DECLARE b DECIMAL(11,2); ... #此变可有可无,为了给个该存储函数执行成功后给个提示,运行下便知道 DECLA...
  • 【MySql】存储过程实现循环查询

    千次阅读 2019-10-24 17:27:50
    查询累计时间段去重的结果 select max(date),count(DISTINCT type) '种类数' ,sum(num) '合计' from del where date>='2019-10-1' and date<='2019-10-1'; select max(date),count(DISTINCT type) '种类数' ...
  • --实现存储过程返回查询结果集合的方法
  • 工作中遇到数据库迁移问题,需要先查询出一张表的ID,然后添加到另外的三方表里面,所以写了这个存储过程,在此做笔记。 DROP PROCEDURE IF EXISTS useCursor; delimiter // /*建立 存储过程 create */ CREATE ...
  • 存储过程循环语句

    2019-01-11 11:31:17
    存储过程循环语句 不需要传入参数: 110后面不需要分号,很奇怪,加分号报错。
  • 存储过程 循环

    千次阅读 2019-08-22 13:29:22
    CREATE OR REPLACE PROCEDURE test_loop as CURSOR emp_cur IS SELECT name,name1,weights,score FROM FACTOR where score is not null order by name; --声明变量接收游标中的数据 v_name FACTOR.name%TYPE;...
  • CREATE OR REPLACE PROCEDURE p_updete_gs is --仅供参考 i_jdid varchar(32);... cursor cur is --游标 给查询赋值 select c.jdid jdid, t.ryid rybh from t_zcj_rctj t,t_zj_jd c where t.r...
  • PostgreSQL存储过程循环调用

    千次阅读 2017-08-07 15:12:38
    需求描述碰到需求,需要往表里插入5万条数据, 打算使用存储过程,但是postgres, 但是postgres没有建存储过程的SQL, 使用函数来实现.表数据结构完整性要求一次插入两条记录, 两条记录相互外键约束, record1 的 partner_...
  • -- 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 "cccc" ( zrr in varchar2 --责任人 ) as  cur_uuid varchar2(50);... for c_zrrs in ( select distinct obj from dual) loop -- 循环  cur_uuid := sys_guid()...
  • mysql存储过程循环修改每一条数据

    千次阅读 2016-04-07 18:02:17
    mysql 使用存储过程 循环逐条判断修改表中每一条数据
  • 希望在一个配置表中存要查的字段,然后在存储过程中读配置表查询结果: configuration表保存需要的列名: select column from configuration; 得到结果集:["column1","column2"...] 然后在存储过程中使用...
  • Mysql循环查询结果并设置排序编号

    千次阅读 2017-12-01 11:16:08
    Mysql循环查询结果并设置排序编号
  • 存储过程循环+调用存储过程

    千次阅读 2017-05-12 14:30:01
    --break跳出循环 return 跳出存储过程  else  --dbms_output.put_line(sqlerrm);  dbms_output.put_line(to_char(dateStart,'yyyy-mm-dd'));  STO_ACCOUNT_AGENT_PROC(to_char(dateStart,'yyyy-mm-dd')...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 533,020
精华内容 213,208
关键字:

存储过程循环查询结果