MySQL 存储过程中的循环

本文详细介绍了SQL中的三种循环语句:WHILE、REPEAT UNTIL 和 LOOP,并通过具体示例展示了它们的用法。此外,文章还讲解了如何使用标签和结束标号以及迭代语句,并提供了相关代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是常用的三种循环方式

WHILE……DO……END WHILE

REPEAT……UNTIL END REPEAT

LOOP……END LOOP


1、 WHILE……DO……END WHILE 示例

DROP PROCEDURE IF EXISTS p_while;
delimiter //
 
create procedure p_while()
begin
declare i int;
set i=0;
while i<5 do
    insert into t1(c1) values(i);
    set i=i+1;
end while;
end;
//

delimiter ;

mysql> delete from t1;
Query OK, 0 rows affected (0.00 sec)

mysql> call p_while();
Query OK, 1 row affected (0.59 sec)

mysql> select * from t1;
+------+
| c1   |
+------+
|    0 |
|    1 |
|    2 |
|    3 |
|    4 |
+------+
5 rows in set (0.00 sec)

2、 REPEAT……UNTIL END REPEAT 示例
DROP PROCEDURE IF EXISTS p_repeat;
delimiter //

create procedure p_repeat()
begin
declare i int default 0;
repeat
    insert into t1(c1) values(i);
    set i=i+1;
    until i>=5
end repeat;
end;
//

delimiter ;

mysql> delete from t1;
Query OK, 0 rows affected (0.00 sec)

mysql> call p_repeat();
Query OK, 1 row affected (0.28 sec)

mysql> select * from t1;
+------+
| c1   |
+------+
|    0 |
|    1 |
|    2 |
|    3 |
|    4 |
+------+
5 rows in set (0.00 sec)

3、LOOP……END LOOP示例
DROP PROCEDURE IF EXISTS p_loop;
delimiter //

create procedure p_loop()
begin
declare i int default 0;
loop_label: loop
    insert into t1(c1) values(i);
    set i=i+1;
    if i>=5 then
        leave loop_label;
    end if;
end loop;
end;
//

delimiter ;

mysql> delete from t1;
Query OK, 0 rows affected (0.00 sec)

mysql> call p_loop();
Query OK, 1 row affected (0.28 sec)

mysql> select * from t1;
+------+
| c1   |
+------+
|    0 |
|    1 |
|    2 |
|    3 |
|    4 |
+------+
5 rows in set (0.00 sec)

4、lebels标号和end labels 结束符标号

说明:下面这个例子可以看出可以在BEGIN、WHILE、REPEAT或者LOOP语句前使用语句标号。leave label_4意思为离开label_4的语句。

DROP PROCEDURE IF EXISTS p_lebel_1;
delimiter //

create procedure p_lebel_1()
label_1:begin
label_2:while 0=1 do leave label_2;end while;
label_3:repeat leave label_3;until 0=0 end repeat;
label_4:loop leave label_4;end loop;
end;
//

delimiter ;

mysql> call p_lebel_1();
Query OK, 0 rows affected (0.00 sec)

也可以使用END labels来表示标号结束符。个结束标号并不是十分有用,而且他必须和开始定义的标号名字一样,否则就会报错。

DROP PROCEDURE IF EXISTS p_lebel_2;
delimiter //

create procedure p_lebel_2()
label_1:begin
label_2:while 0=1 do leave label_2;end while label_2;
label_3:repeat leave label_3;until 0=0 end repeat label_3;
label_4:loop leave label_4;end loop label_4;
end label_1;
//

delimiter ;

mysql> call p_lebel_2();
Query OK, 0 rows affected (0.00 sec)
5、 ITERATE 迭代
如果是在ITERATE语句,即迭代语句中的话,就必须使用LEAVE语句。 ITERATE 只能出现在LOOP,REPEAT和WHILE语句中,它的意思是“再次循环”,

DROP PROCEDURE IF EXISTS p_iterate;
delimiter //

create procedure p_iterate()
begin
declare i int default 0;
loop_label:loop
    if i=3 then
        set i=i+1;
        iterate loop_label;
    end if;
    insert into t1(c1) values(i);
    set i=i+1;
    if i>=5 then
       leave loop_label;
    end if;
  end loop;
end;
//

delimiter ;

mysql> delete from t1;
Query OK, 0 rows affected (0.00 sec)

mysql> call p_iterate();
Query OK, 1 row affected (0.36 sec)

mysql> select * from t1;
+------+
| c1   |
+------+
|    0 |
|    1 |
|    2 |
|    4 |
+------+
4 rows in set (0.00 sec)






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值