Mysql这几种语句标签,你用过几个
在《mysql存储过程细节窥探》这篇文章中我们简单介绍了存储过程的使用,其中在创建存储过程的语法中有BEGIN……END。除了BEGIN……END之外,在存储过程的存储体内可以使用的语句标签有下面几种:
[begin_label:] BEGIN
[statement_list]
END [end_label]
[begin_label:] LOOP
statement_list
END LOOP [end_label]
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
下面我们对上述语句分别进行一下解释:
begin_label 如果要给出begin_label,则后面必须带着冒号(:)。并且给出了begin_label,最后不一定非得跟着end_label。但是,如果给出end_label,那end_label必须和begin_label相同。
end_label 对于这个标签,不能在没有begin_label的情况下单独给出end_label。
还有一点需要说明,对于这些label,每一层中的label必须是唯一的,不能相同。并且每个label的字符串长度最长为16个字符。
下面我们举个例子。
例一
mysql>delimiter //
mysql>CREATE PROCEDURE doiterate(p1 INT)
-->BEGIN
--> label1: LOOP
--> SET p1 = p1 + 1;
--> IF p1 < 10 THEN ITERATE label1; END IF;
--> LEAVE label1;
--> END LOOP label1;
-->END;
mysql>delimiter ;
上面的例子中label1就是上面我们说到的begin_label和end_label。根据上面我们的说明,上面的例子也可以改成如下的形式。
例二
mysql>delimiter //
mysql>CREATE PROCEDURE doiterate(p1 INT)
-->BEGIN
--> label1: LOOP
--> SET p1 = p1 + 1;
--> IF p1 < 10 THEN ITERATE label1; END IF;
--> LEAVE label1;
--> END LOOP;
-->END;
mysql>delimiter ;
接下来我们分别看一下上述几种语句标签的应用。
1. BEGIN……END
BEGIN … END主要用于写复合语句的。一个复合语句可能会包含多条语句,这些语句都是由BEGIN … END界定的。就像我们下面这个例子。
例三
mysql> delimiter //
mysql> create procedure adddata()
-->begin
--> declare n int default 0;
--> while n<100000
--> do
--> insert into proced(name,type) values(‘迹忆博客’,’onmpw’);
--> set n = n+1;
--> end while;
-->end
-->//
mysql> delimiter ;
并且BEGIN … END块儿是可以被嵌套的。而且还可以被冠以名称。
例四
mysql> delimiter //
mysql> CREATE PROCEDURE adddata()
-->label1:BEGIN
--> declare n int default 0;
--> while n<100000
--> do
--> insert into proced(name,type) values(‘迹忆博客’,’onmpw’);
--> set n = n+1;
--> end while;
-->END label1
-->//
mysql> delimiter ;
2. LOOP
[begin_label:] LOOP
statement_list
END LOOP [end_label]
LOOP 作用是重复执行statement_list,它可能包含一条或多条执行语句。这些语句都是用分号(;)来界定的,所以之前我们需要先使用delimiter //命令改变客户端命令行的界定符。这个命令在《mysql存储过程细节窥探》中有说过。对于这个标签的使用实例如下。
例五
mysql> delimiter //
mysql>CREATE PROCEDURE doiterate(p1 INT)
-->BEGIN
--> label1: LOOP
--> SET p1 = p1 + 1;
--> IF p1 < 10 THEN
--> ITERATE label1;
--> END IF;
--> LEAVE label1;
--> END LOOP label1;
--> SET @x = p1;
-->END;
mysql> delimiter ;
LOOP的需要借助ITERATE 来重复,而LOOP的循环结束需要有LEAVE来完成,当然也可以使用RETURN。这里的LEAVE我们可以理解成编程语言中的break来跳出循环。RETURN可以理解成编程语言中的return,亦可以跳出循环,不过这个是整个程序的退出。
3. REPEAT
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
同样REPEAT重复执行块儿内的statement_list,直到UNTIL的条件不成立的时候结束循环。因此,我们可以看出statement_list至少被执行一次。此语句标签可以理解成编程语言中的do{}while();
使用示例如下。
例六
mysql> delimiter //
mysql> CREATE PROCEDURE dorepeat(p1 INT)
-->BEGIN
--> SET @x = 0;
--> REPEAT
--> SET @x = @x + 1;
--> UNTIL @x > p1
-->END REPEAT;
--> END
--> //
mysql>delimiter ;
mysql> CALL dorepeat(1000);
mysql> SELECT @x;
+---------+
| @x |
+---------+
| 1001 |
+---------+
4. WHILE
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
WHILE表示在此块儿内的statement_list被重复执行,只要search_condition为真就会执行。也就是说此WHILE语句标签相当于编程语言中的while(){}语句。
使用示例如下。
例七
mysql> delimiter //
mysql>CREATE PROCEDURE dowhile()
-->BEGIN
--> DECLARE v1 INT DEFAULT 5;
--> label1:WHILE v1 > 0 DO
--> SET v1 = v1 - 1;
--> END WHILE label1;
-->END//
mysql>delimiter ;
以上就是对几种语句标签的简单介绍。
相关文章
使用 Mysqldump 备份 MySQL 中的数据
发布时间:2023/05/09 浏览次数:192 分类:MySQL
-
本篇文章将介绍如何使用 mysqldump 只备份数据。 在这里,我们将探讨 --no-create-info 、--compact 、--skip-triggers 和 --no-create-db 选项。
更新 MySQL 表中的主键
发布时间:2023/05/09 浏览次数:61 分类:MySQL
-
本篇文章介绍如何更新 MySQL 表中的主键。 我们将使用 ALTER 命令对主键进行任何更改。更新 MySQL 表中的主键 我们可以在多种情况下更新 MySQL 表中的主键。
在 MySQL 中获取命令历史记录
发布时间:2023/05/09 浏览次数:150 分类:MySQL
-
本文重点介绍了在 Windows 和 Linux 中获取我们已执行的 MySQL 命令历史记录的各种方法。MySQL命令历史
Oracle 的 decode 函数在 MySQL 中的等价物
发布时间:2023/05/09 浏览次数:115 分类:MySQL
-
本篇文章介绍了三种替代实现,我们可以将它们用作 MySQL 中 Oracle 的 decode() 函数的等价物。 为此,我们将使用 IF()、CASE 以及 FIELD() 和 ELT() 的组合。
使用 Ubuntu 连接远程 MySQL 服务器的不同方法
发布时间:2023/05/09 浏览次数:97 分类:MySQL
-
在本文中我们将学习如何使用 Ubuntu 连接远程 MySQL 服务器来操作数据以及启动和停止 MySQL 服务器。
在 Linux 中安装 MySQL 客户端
发布时间:2023/05/09 浏览次数:72 分类:MySQL
-
在 Linux 中安装 MySQL 客户端的命令。Linux 和 Unix 等环境作为命令行界面工作,仅在命令的帮助下运行。
在 MySQL 中转换为十进制
发布时间:2023/05/09 浏览次数:150 分类:MySQL
-
有时,我们可能需要将一种数据类型转换为另一种数据类型。 下面是我们如何使用带有 DECIMAL(M,D) 的 CAST() 和 CONVERT() 函数在 MySQL 中转换为十进制。
在 MySQL 中获取当前日期和时间
发布时间:2023/05/09 浏览次数:145 分类:MySQL
-
本篇文章我们将学习 NOW()、CURRENT_TIMESTAMP()(也写为 CURRENT_TIMESTAMP)和 SYSDATE() 来获取 MySQL 中的当前日期和时间。 我们还将看到这三个功能之间的比较。在 MySQL 中获取当前日期和时间
更改 MySQL 服务器中的 max_allowed_packet Size
发布时间:2023/05/09 浏览次数:142 分类:MySQL
-
本篇文章介绍如何更改 MySQL 服务器中的 max_allowed_packet 大小。 为了了解这一点,我们将使用两个操作系统,Windows 10 和 Linux (Ubuntu)。