热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql循环delete_mysql的delete怎么和子循环使用

展开全部Mysql的存储过程是从版本5才开始支持的,所以目前一般32313133353236313431303231363533e58685e5aeb93133343

展开全部

Mysql的存储过程是从版本5才开始支持的,所以目前一般32313133353236313431303231363533e58685e5aeb931333431343635使用的都可以用到存储过程。今天分享下自己对于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 &#61; v &#43; 1;

END WHILE;

END;

这是WHILE循环的方式。它跟IF语句相似&#xff0c;使用"SET v &#61; 0;"语句使为了防止一个常见的错误&#xff0c;如果没有初始化&#xff0c;默认变量值为NULL&#xff0c;而NULL和任何值操作结果都为NULL。

(2)REPEAT ... END REPEAT

代码如下:

CREATE PROCEDURE p15 ()

BEGIN

DECLARE v INT;

SET v &#61; 0;

REPEAT

INSERT INTO t VALUES (v);

SET v &#61; v &#43; 1;

UNTIL v >&#61; 5

END REPEAT;

END;

这是REPEAT循环的例子&#xff0c;功能和前面WHILE循环一样。区别在于它在执行后检查结果&#xff0c;而WHILE则是执行前检查。类似于do while语句。注意到UNTIL语句后面没有分号&#xff0c;在这里可以不写分号&#xff0c;当然你加上额外的分号更好。

(3)LOOP ... END LOOP

代码如下:

CREATE PROCEDURE p16 ()

BEGIN

DECLARE v INT;

SET v &#61; 0;

loop_label: LOOP

INSERT INTO t VALUES (v);

SET v &#61; v &#43; 1;

IF v >&#61; 5 THEN

LEAVE loop_label;

END IF;

END LOOP;

END;

以上是LOOP循环的例子。LOOP循环不需要初始条件&#xff0c;这点和WHILE循环相似&#xff0c;同时它又和REPEAT循环一样也不需要结束条件。

ITERATE 迭代

如果目标是ITERATE(迭代)语句的话&#xff0c;就必须用到LEAVE语句

代码如下:

CREATE PROCEDURE p20 ()

BEGIN

DECLARE v INT;

SET v &#61; 0;

loop_label: LOOP

IF v &#61; 3 THEN

SET v &#61; v &#43; 1;

ITERATE loop_label;

END IF;

INSERT INTO t VALUES (v);

SET v &#61; v &#43; 1;

IF v >&#61; 5 THEN

LEAVE loop_label;

END IF;

END LOOP;

END;

ITERATE(迭代)语句和LEAVE语句一样也是在循环内部的循环引用&#xff0c; 它有点像C语言中 的“Continue”&#xff0c;同样它可以出现在复合语句中&#xff0c;引用复合语句标号&#xff0c;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&#61;1;//申明循环结束的标志位

set done&#61;0;

select date_format(now(),&#39;%Y&#39;) into p_year;

open feeCodeCursor;//打开游标

loop_label:LOOP

fetch feeCodeCursor into p_feeCode;//将游标插入申明的变量

if done &#61; 1 then

leave loop_label;

else

set flag &#61; 0;

end if;

set p_schemeMoney&#61;0;

set p_billMoney &#61; 0;

select feeName into p_feeName from fee where feeCode&#61;p_feeCode;

select sum(billMoney) into p_billMoney from bill_data where feeCode&#61;p_feeCode and billDate like Concat(p_year, &#39;%&#39;);

select schemeMoney into p_schemeMoney from total_scheme where feeCode&#61;p_feeCode and schemeDate like Concat(p_year, &#39;%&#39;) limit 1;

if flag &#61; 0 then

set done &#61; 0;

end if;

if p_schemeMoney&#61;0 then

set p_totalCompeleteRate&#61;-1.0;

else

set p_totalCompeleteRate&#61;(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

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

代码如下:

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&#61;1;

set done1&#61;0;

select date_format(now(),&#39;%Y&#39;) 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&#61;p_feeCode;

if not done1 then

begin

declare projectIDCursor cursor for select projectID from project;

declare continue handler for not found set done2 &#61; 1;

set done2&#61;0;

open projectIDCursor;

loop_label:LOOP//第二层嵌套开始

fetch projectIDCursor into p_projectID;

select projectName into p_projectName from project where projectID&#61;p_projectID;

if done2 &#61; 1 then

leave loop_label;

else

set flag &#61; 0;

end if;

if not done2 then

set p_projectSchemeMoney&#61;0;

select sum(billMoney) into p_billMoney from bill_data where feeCode&#61;p_feeCode and projectID&#61;p_projectID and billDate like Concat(p_year, &#39;%&#39;);

select projectSchemeMoney into p_projectSchemeMoney from project_scheme where feeCode&#61;p_feeCode and projectID&#61;p_projectID;

if flag &#61; 0 then

set done2 &#61; 0;

end if;

if p_projectSchemeMoney&#61;0 then

set p_projectFeeCompeleteRate&#61;-1;

else

set p_projectFeeCompeleteRate&#61;(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&#61;p_feeCode and billDate like Concat(p_year, &#39;%&#39;);

set p_projectFeeCompeleteRate&#61;(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

本回答被网友采纳

2Q&#61;&#61;

已赞过

已踩过<

你对这个回答的评价是&#xff1f;

评论

收起



推荐阅读
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • 《2017年3月全国计算机等级考试二级C语言上机题库完全版》由会员分享,可在线阅读,更多相关《2017年3月全国计算机等级考试二级C语言上机题库完全版( ... [详细]
  • c语言基础编写,c语言 基础
    本文目录一览:1、C语言如何编写?2、如何编写 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • 利用空间换时间减少时间复杂度以及以C语言字符串处理为例减少空间复杂度
    在处理字符串的过程当中,通常情况下都会逐个遍历整个字符串数组,在多个字符串的处理中,处理不同,时间复杂度不同,这里通过利用空间换时间等不同方法,以字符串处理为例来讨论几种情况:1: ... [详细]
author-avatar
最好的冰雪之母_227
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有