`
songf_software
  • 浏览: 2177 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Mysql存储过程游标加循环 .

阅读更多

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存储过程-实现两个游标的循环.doc

    mysql存储过程-实现两个游标的循环.doc

    Mysql游标(循环操作)

    在MySQL中,游标是一种数据库对象,主要用于处理存储过程中的结果集。游标允许我们逐行地读取查询结果,这对于需要对每一行数据执行特定操作的情况非常有用。通过使用游标,我们可以实现更加灵活的数据处理逻辑。 #...

    MySQL存储过程中游标循环的跳出和继续操作示例

    本篇文章将详细讨论在MySQL存储过程中如何使用游标循环,并特别关注如何进行跳出和继续操作。 首先,游标循环通常有三种基本形式:`LOOP`、`REPEAT`和`WHILE`。每种循环结构都有其特定的语法和用途,但核心思想都是...

    2021年MySQL高级教程视频.rar

    22.MySQL高级存储过程语法while循环.avi 23.MySQL高级存储过程语法repeat循环.avi 24.MySQL高级存储过程语法loop循环.avi 25.MySQL高级存储过程语法游标介绍.avi 26.MySQL高级存储过程语法游标基本操作.avi 27.MySQL...

    Mysql存储过程循环内嵌套使用游标示例代码

    总结来说,这个示例展示了如何在MySQL存储过程中使用游标进行循环处理,并在循环内部再次嵌套游标以实现更精细的数据操作。这种技术在处理大量数据或执行复杂逻辑时非常有用,尤其是在需要逐行检查和处理数据的情况...

    mysql存储过程_游标_项目练习

    在“mysql存储过程_游标_项目练习”中,我们可能需要完成以下任务: 1. 创建存储过程:编写SQL语句来定义一个存储过程,包括输入参数(如果需要的话)、处理逻辑以及返回值(可选)。 2. 使用游标:在存储过程中...

    Oracle存储过程游标详解

    如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。 Oracle 存储过程游标是指在 Oracle 数据库中使用游标来实现对结果集的处理和操作。它可以帮助开发者更好地处理和操作结果集,但需要注意避免使用...

    mysql存储过程 游标 循环使用介绍

    总结来说,MySQL存储过程中的游标和循环机制提供了强大的数据处理能力。通过游标,我们可以逐行处理数据,结合循环结构,能够灵活地实现复杂的数据操作逻辑。在实际应用中,这些工具常用于批量插入、更新、计算统计...

    MySQL高级教程视频.zip

    目录网盘文件永久链接 第一天视频 01.课程内容介绍.mp4 02.Linux上安装MySQL 03.启动及登录MySQL 04.索引 - 概述 05.索引 - 优势和劣势 06.索引 - 数据结构 ...27.存储过程 - 语法 - 循环获取游标 ......

    mysql 多个游标依次执行

    mysql存储过程 多个游标循环(依次执行,非嵌套循环)REPEAT循环。有需要的可自行下载。

    mysql函数、存储过程、触发器、游标.doc

    MySQL是世界上最流行的开源关系型数据库管理系统之一,它包含多种功能,如函数、存储过程、触发器和游标,这些功能极大地增强了数据库管理的灵活性和效率。以下是对这些概念的详细解释: 1. **MySQL函数**:MySQL...

    mysql游标存储过程例子

    根据提供的文件信息,本文将详细解释一个MySQL存储过程的例子,其中包含了游标的使用。这个存储过程主要用于处理一批数据,涉及到日期范围内的数据处理、异常处理等。下面将逐一解析存储过程中涉及的重要知识点。 #...

    mysql复杂存储过程实例(游标、临时表、循环、递归)

    本资源结合实例实现一个复杂的存储过程,存储过程中有用到游标、临时表、循环、递归等知识,sql文件附有实例数据表创建的sql语句。

    MySQL存储过程[整理].pdf

    MySQL存储过程是数据库管理系统中的一个重要功能,它允许用户在数据库中定义一组SQL语句并封装为可重用的程序单元。这个PDF文档可能详细介绍了MySQL 5.0版本中的存储过程特性,该版本引入了许多增强的功能。 1. **...

    mysql游标实现到了最后一个结束之后结束循环

    这篇博客文章“mysql游标实现到了最后一个结束之后结束循环”可能详细介绍了如何在MySQL中使用游标来处理数据,以及如何在循环结束时正确地关闭游标,防止资源浪费。 在MySQL中,游标的使用通常包括以下步骤: 1. ...

    mysql 查询存储过程的 sql 语句.docx

    ### MySQL 查询存储过程详解 #### 一、存储过程概述 MySQL 存储过程是一种存储在 MySQL 服务器中的 SQL 代码段,它能够被多个客户端多次调用。存储过程的主要优势在于能够简化复杂的 SQL 查询,执行常见的任务,...

    过程和游标实验.rar

    在数据库管理领域,过程和游标是两种非常重要的概念,特别是在使用结构化查询语言(SQL)进行编程时。过程和游标在数据库操作中扮演着关键角色,它们帮助开发者实现更复杂的逻辑和数据处理。 **过程(Procedure)**...

    mysql动态游标学习(mysql存储过程游标)

    MySQL中的动态游标是数据库处理过程中非常有用的一个特性,它允许在存储过程中逐行处理查询结果。在本示例中,我们将深入探讨如何在MySQL中使用动态游标,特别是结合存储过程来实现这一功能。 首先,创建了一个名为...

Global site tag (gtag.js) - Google Analytics