mysql存储过程之循环(WHILE,REPEAT和LOOP)

2023-11-05

MySQL提供循环语句,允许我们根据条件重复执行一个SQL代码块其中有三个循环语句:WHILEREPEATLOOP,我们接下来分别看下。首先是WHILE语句来看下语法:

WHILE expression DO
   statements
END WHILE

WHILE循环在每次迭代开始时检查表达式。 如果expressionevaluatesTRUE,MySQL将执行WHILEEND WHILE之间的语句,直到expressionevaluatesFALSEWHILE循环称为预先测试条件循环,因为它总是在执行前检查语句的表达式。来看下流程图:

完事咱们尝试在存储过程中使用WHILE循环语句,看个实例:

DELIMITER $$
 DROP PROCEDURE IF EXISTS test_mysql_while_loop$$
 CREATE PROCEDURE test_mysql_while_loop()
 BEGIN
 DECLARE x  INT;
 DECLARE str  VARCHAR(255);

 SET x = 1;
 SET str =  '';

 WHILE x  <= 5 DO
 SET  str = CONCAT(str,x,',');
 SET  x = x + 1; 
 END WHILE;

 SELECT str;
 END$$
DELIMITER ;

在上面的test_mysql_while_loop存储过程中,它的操作是先来重复构建str字符串,直到x变量的值大于5,完事使用select语句显示最终的字符串。我们要注意的是,如果不初始化x变量的值,那么它默认值为NULL。 因此,WHILE循环语句中的条件始终为TRUE,并且我们将有一个不确定的循环,这是不可预料的。废话不多说,我们先来调用test_mysql_while_loopstored存储过程:

CALL test_mysql_while_loop();

执行上面查询语句,得到以下结果:

mysql> CALL test_mysql_while_loop();
+------------+
| str        |
+------------+
| 1,2,3,4,5, |
+------------+
1 row in set

Query OK, 0 rows affected

完事再来看REPEAT循环语句的语法结构:

REPEAT
 statements;
UNTIL expression
END REPEAT

上述sql首先被mysql执行,完事mysql会评估求值表达式(expression),如果表达式(expression)的计算结果为FALSE,则mysql将重复执行该语句,直到该表达式计算结果为TRUE。因为REPEAT循环语句在执行语句后检查表达式(expression),因此REPEAT循环语句也称为测试后循环。咱们来看下流程图:

完事咱们再来使用REPEAT循环语句重写test_mysql_while_loop存储过程:

DELIMITER $$
 DROP PROCEDURE IF EXISTS mysql_test_repeat_loop$$
 CREATE PROCEDURE mysql_test_repeat_loop()
 BEGIN
 DECLARE x INT;
 DECLARE str VARCHAR(255);

 SET x = 1;
        SET str =  '';

 REPEAT
 SET  str = CONCAT(str,x,',');
 SET  x = x + 1; 
        UNTIL x  > 5
        END REPEAT;

        SELECT str;
 END$$
DELIMITER ;

我们要注意的是UNTIL表达式中没有分号(;)。执行上面查询语句,得到以下结果:

mysql> CALL mysql_test_repeat_loop();
+------------+
| str        |
+------------+
| 1,2,3,4,5, |
+------------+
1 row in set

Query OK, 0 rows affected

最后咱们再来看一个使用LOOP循环语句的示例:

CREATE PROCEDURE test_mysql_loop()
 BEGIN
 DECLARE x  INT;
        DECLARE str  VARCHAR(255);

 SET x = 1;
        SET str =  '';

 loop_label:  LOOP
 IF  x > 10 THEN 
 LEAVE  loop_label;
 END  IF;

 SET  x = x + 1;
 IF (x mod 2) THEN
     ITERATE  loop_label;
 ELSE
    SET  str = CONCAT(str,x,',');
 END IF;
    END LOOP;    
    SELECT str;
END;

上述sql具体作用如下:

  • 以上存储过程仅构造具有偶数字符串的字符串,例如2,4,6等。
  • LOOP语句之前放置一个loop_label循环标签。
  • 如果x的值大于10,则由于LEAVE语句,循环被终止。
  • 如果x的值是一个奇数,ITERATE语句忽略它下面的所有内容,并开始一个新的迭代。
  • 如果x的值是偶数,则ELSE语句中的块将使用偶数构建字符串。

执行上面查询语句,得到以下结果:

mysql> CALL test_mysql_loop();
+-------------+
| str         |
+-------------+
| 2,4,6,8,10, |
+-------------+
1 row in set

Query OK, 0 rows affected

完事咱们再来看下控制循环的两个关键词:

  • LEAVE语句用于立即退出循环,而无需等待检查条件。LEAVE语句的工作原理就类似PHP,C/C++,java等其他语言的break语句一样。
  • ITERATE语句允许您跳过剩下的整个代码并开始新的迭代。ITERATE语句类似于PHPC/C++Java等中的continue语句。

好啦,本次记录就到这里了。

如果感觉不错的话,请多多点赞支持哦。。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql存储过程之循环(WHILE,REPEAT和LOOP) 的相关文章

  • SQL查询:按字符长度排序?

    是否可以按字符总数对sql数据行进行排序 e g SELECT FROM database ORDER BY data length 我想你想用这个 http dev mysql com doc refman 5 0 en string f
  • varchar(20) 和 varchar(50) 相同吗?

    我看到评论 如果 varchar 20 列中有 5000 万个 10 到 15 个字符之间的值 而 varchar 50 列中有同样的 5000 万个值 它们将占用完全相同的空间 这就是重点varchar 而不是 char 有人可以告诉我原
  • SQL日期格式转换? [dd.mm.yy 至 YYYY-MM-DD]

    是否有 mySQL 函数可以将日期从 dd mm yy 格式转换为 YYYY MM DD 例如 03 09 13 gt 2013 09 03 由于您的输入是表单中的字符串03 09 13 我假设 因为今天是 2013 年 9 月 3 日 d
  • 如何在 mysql 中两次连接同一个表?

    我有2张桌子 其中一个 域 具有域 ID 和域名 dom id dom url 另一列包含实际数据 其中 2 列需要 TO 和 FROM 域名 所以我有 2 列 rev dom from 和 rev dom for 它们都存储域表中的域名
  • 编写多个mysql脚本

    是否可以在复合脚本中包含其他 mysql 脚本 理想情况下 我不想为包含的脚本创建存储过程 对于较大的项目 我想分层维护几个较小的脚本 然后根据需要组合它们 但现在 我很乐意学习如何包含其他脚本 source是一个内置命令 您可以在 MyS
  • 会话 bean 中的 EntityManager 异常处理

    我有一个托管无状态会话 bean 其中注入了 EntityManager em 我想做的是拥有一个具有唯一列的数据库表 然后我运行一些尝试插入实体的算法 但是 如果实体存在 它将更新它或跳过它 我想要这样的东西 try em persist
  • 选择不带 FROM 但有多于一行的选择

    如何在不从现有表中进行选择的情况下生成 2 行 2 列的表 我正在寻找的是一个返回的选择语句 e g id value 1 103 2 556 Use UNION http dev mysql com doc refman 5 0 en u
  • html 下钻下拉所选值未插入 MYSQL

    我有两个下拉列表 首先从数据库下拉填充 根据第一个下拉列表的选定值从数据库填充第二个下拉列表 document ready function c change function var c1 c selected text if c1 aj
  • MySQL JSON 存储与两个表

    与使用单独的元表相比 使用 JSON 在表中存储数据有什么好处吗 这是原始架构 Users Table UserId Username Etc 5 John Avatar Table Id UserId ImageName ImageTyp
  • 数据包无序。得到:80 预期:0 node.js

    这是我的 非常简单 代码 var connection mysql createConnection infosDB connection connect connection query SELECT FROM action functi
  • Java:使用PreparedStatement将多行插入MySQL

    我想使用 Java 一次将多行插入 MySQL 表中 行数是动态的 过去我在做 for String element array myStatement setString 1 element 0 myStatement setString
  • 如何在pandas中将字符串转换为没有日期的日期时间

    例如issue d数据框中的列是字符串 df issue d Dec 2012 我想将字符串转换为日期时间类型而不是字符串类型 2012 12 怎么做 I use datetime strptime x b Y for x in df is
  • MySQL按总和连接表问题

    我在连接表时遇到问题 以下是示例表 表A 30行 ID Name Description 1 Type Unicode Art 2 Header Spreadsheet 3 Auto Align Off 表B 100行 ID Name De
  • SQL DML:日期值不正确 (MySQL)

    我在数据库中创建了一个表 CREATE TABLE official receipt student no INT UNSIGNED academic year CHAR 8 trimester ENUM 1 2 3 or no MEDIU
  • MySQL 如何使用返回多行的 SELECT 子查询插入表?

    MySQL 如何使用返回多行的 SELECT 子查询插入表 INSERT INTO Results People names VALUES SELECT d id FROM Names f JOIN People d ON d id f i
  • 严格标准:资源 ID#73 用作偏移量,转换为整数

    我使用这个 PHP 函数获取 MySql 结果 function fetcharray query id if query id query id this gt query res if query id this gt q array
  • 获取jdbc中表依赖顺序

    我在 MySQL 数据库中有一组表 A B C D 依赖关系如下 B gt C gt A 和 D gt A 也就是说 A 有一个 PrimaryKey C 有一个外键指向 A 的主键 B 有一个外键指向 C 的主键 类似地 D 有一个外键指
  • 我应该保留远程数据库的本地副本吗?

    我正在开发一个应用程序 基本上允许人们创建 加入和管理其他人的群组 群组内的人也可以互相发送消息 我一直在想哪条路会更好 保留包含所有信息的远程数据库 包括发送给用户和从用户发送的消息 并让应用程序在每次需要信息时查询服务器 甚至是它以前见
  • BigDecimal 的 JPA @Size 注释

    我该如何使用 SizeMySQL 的注释DECIMAL x y 列 我在用着BigDecimal 但是当我尝试包括 Size max它不起作用 这是我的代码 Size max 7 2 Column name weight private B
  • MySQL ALTER TABLE 挂起

    我知道这个问题已经被问过好几次了 但我的问题发生在我刚刚创建的表上 它只有 10 列和 1 行 因此 与通常的挂起问题不同 这不是具有大量数据的大表的情况 但它仍然挂着 这是我正在运行的 SQL ALTER TABLE db Search

随机推荐

  • linux内核编译问题解决方法

    在linux内核编译过程中 可能会遇到有些文件没有的可能 下面是我用gcc4 6 2编译linux2 6 30 5内核过程中提示的错误 gcc error elf i386 No such file or directory OBJCOPY
  • linux下select()函数

    1 I O处理的模型有5种 1 gt 阻塞I O模型 在这种模型下 若所调用的I O函数没有完成相关的功能 则会使进程挂起 直到相关数据到达才会返回 如常见的对管道 终端 网络设备进行读写时经常会出现这种情况 2 gt 非阻塞I O模型 在
  • Python——基础学习xpath(爬虫)

    python三种解析方法 1 正则 2 bs4 3 xpath Python xpath解析 xpath解析是最常用且最便捷高效的一种解析方法 通用性最强 xpath解析原理 1 实例一个etree的对象 且需要将被解析的页面的源码数据加载
  • 转载,envi对高光谱进行辐射定标和大气校正

    原文地址 http blog sina com cn s blog 764b1e9d0102v59e html 目录 辐射定标和大气校正 概述 辐射定标 多光谱数据FLAASH大气校正 3 1 FLAASH输入数据要求 3 2 详细操作步骤
  • 去除list of list中的引号与括号

    经常分词后是List of list的结构 输出后会存在很多引号与方括号 它其实是一个list的嵌套结构 可以通过将内层的List转化为str再放入新的list中实现转化 a 我要发 SCI 然后 去 四川大学 读博士 result for
  • Laya 实操十七:物理引擎

    物理引擎 export default class test extends Laya Script constructor super Laya Scene3D load res LayaScene SampleScene Convent
  • Python清洗数据具体操作

    数据清洗是指在处理数据之前对数据进行预处理的过程 这个过程通常包括检查数据的完整性 清除数据中的缺失值 异常值和重复值 以及对数据进行格式转换和数据转换等 在 Python 中 可以使用 pandas 库来方便地进行数据清洗 下面是一些常见
  • Android 禁止RecycleView的滑动

    1 问题 使用RecycleView 时 如果数据量很少只有几个 需求不需要它上下左右滑动 在xml配置中加上Android scrollbars none 这只是去掉了滑动bar 但是RecycleView 上下还是能滑动 且有阴影 2
  • 【message:发生错误 Error: D:\微信小程序\second-demo\package.json 对应的 node_modules 不存在】

    微信小程序安装vant weapp报 node module不存在 提示 这里简述项目相关背景 想使用vant weapp写小程序 在安装的时候踩了一些坑 记录一下 1 安装 vant weapp 提示 这里一个一个来描述遇到的问题 我是根
  • 网络驱动程序snull

    由于下次开会要做报告 所以就先把字符设备驱动程序那块搁浅了 先来复习下网络驱动这块 虽然以前看过 学习过网络驱动的相关内容 但是当再次学习这块的时候 仍然有新的收获 或许是时间长不看了 有些东西的印象浅了 或者应了那句话 温故而知新 ok
  • 多线程能有事务吗?

    需求 多线程插入 保证原子性 要么都成功 要么都失败 其中一个线程报错 所有线程回滚 为什么做不了 首先事务的四大特性 ACID 特性都知道吧 面试中张口就来 原子性 Atomicity 一个事务要么全部提交成功 要么全部失败回滚 不能只执
  • SpringFramework核心技术五:面向切面编程(AOP)和代理机制

    AOP与代理 Spring AOP使用JDK动态代理或CGLIB为给定目标对象创建代理 只要有选择 JDK动态代理就是首选 一 代理机制 如果要代理的目标对象实现至少一个接口 则将使用JDK动态代理 目标类型实现的所有接口都将被代理 如果目
  • socket异步编程--libevent的使用

    http www cnblogs com cnspace archive 2011 07 19 2110891 html 这篇文章介绍下libevent在socket异步编程中的应用 在一些对性能要求较高的网络应用程序中 为了防止程序阻塞在
  • Spring Boot集成RocketMq(一看就会)

    目录 1 创建topic 2 新建Spring boot项目 3 导入依赖 4 配置yml文件 5 新建Controller 生产服务 6 新建消费者 7 配置类 定义topic 8 添加消息以及 消费者查看 8 1 调用接口 往Mq中添加
  • 岛屿数量(Java)

    分析 把1当成陆地 0当成海 简单来说只要上下左右如果是1的话就可以看成一个陆地 从示例中也可以很清楚的看懂 思路 用一个和grid大小一样的整型二维数组arr来代表岛屿的生成过程 遍历grid 如果遇到grid i j 1 arr i j
  • 软件生命周期与技术人的职业周期

    话题有点大 但还是忍住想说两句 也算把自己曾经的困惑落在纸上 做个记录 什么是软件的生命周期的 相信你能比我还熟练的罗列出来 从初步规划 到需求分析 再到系统设计 接着系统实现 往下系统测试 跟着发布部署 最后运行维护 中途免不了打些小补丁
  • UART通信原理

    UART 通信格式 串口全称叫做串行接口 通常也叫做 COM 接口 串行接口指的是数据一个一个的顺序传输 通信线路简单 使用两条线即可实现双向通信 一条用于发送 一条用于接收 串口通信距离远 但是速度相对会低 串口是一种很常用的工业接口 I
  • python国内镜像源

    让python pip使用国内镜像 国内源 清华 https pypi tuna tsinghua edu cn simple 阿里云 http mirrors aliyun com pypi simple 中国科技大学 https pyp
  • 有关HC-05蓝牙模块的学习记录

    文章目录 HC 05学习笔记 一 HC 05的基本硬件介绍 二 工作原理 三 使用方法 一 硬件连接 二 软件控制 1 第一个片段 2 第二个片段 四 具体应用 一 信息的传送 二 手机操纵单片机 五 注意事项 一 AT状态 1 第一种方法
  • mysql存储过程之循环(WHILE,REPEAT和LOOP)

    MySQL提供循环语句 允许我们根据条件重复执行一个SQL代码块其中有三个循环语句 WHILE REPEAT和LOOP 我们接下来分别看下 首先是WHILE语句来看下语法 WHILE expression DO statements END