热门标签 | 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;

评论

收起



推荐阅读
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 在将Excel数据导入MySQL数据库的过程中,如何确保不会生成重复记录?本文介绍了一种方法,通过PHP脚本检查数据库中是否存在相同的“Code”字段值,从而避免重复记录的产生。该方法不仅提高了数据导入的准确性,还增强了系统的健壮性。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细介绍了数据库并发控制的基本概念、重要性和具体实现方法。并发控制是确保多个事务在同时操作数据库时保持数据一致性的关键机制。文章涵盖了锁机制、多版本并发控制(MVCC)、乐观并发控制和悲观并发控制等内容。 ... [详细]
  • 数据类型和操作数据表2.1MySQL类型之整型2.2MySQL数据类型之浮点型2.3日期时间型DATE1支持时间:1000年1月1日~9999年12月31日DATETIME ... [详细]
  • 在处理数据库中所有用户表的彻底清除时,目前尚未发现单一命令能够实现这一目标。因此,需要采用一种较为繁琐的方法来逐个删除相关表及其结构。具体操作可以通过编写PL/SQL脚本来实现,该脚本将动态生成并执行删除表的SQL语句。尽管这种方法相对复杂,但在缺乏更简便手段的情况下,仍是一种有效的解决方案。未来或许可以通过数据库管理工具或更高版本的数据库系统提供更简洁的处理方式。 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 如何有效防御网站中的SQL注入攻击
    本期文章将深入探讨网站如何有效防御SQL注入攻击。我们将从技术层面详细解析防范措施,并结合实际案例进行阐述,旨在帮助读者全面了解并掌握有效的防护策略。希望本文能为您的网络安全提供有益参考。 ... [详细]
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社区 版权所有