流程控制的使用彩民之家高手论坛

2019-10-11 12:04 来源:未知
DELIMITER $$
CREATE PROCEDURE proc_demo_loop()
BEGIN
    DECLARE increase INT DEFAULT 1;
    SET @x=0;
    ins: LOOP
      SET increase=increase 1;  
      IF increase =100 THEN
        SET @x=increase;
        -- 退出
        LEAVE ins;
      END IF;

     END LOOP ins;    
END $$
DELIMITER ;

-- 调用
CALL proc_demo_loop;
SELECT @x;

REPEAT语句

REPEAT语句用于创设二个包蕴条件剖断的巡回进度,每一次说话实践实现之后,会对标准表明式举办判断,倘若表明式为真,则循环截至;不然重复实践循环中的语句,REPEAT语句的基本语法格式如下:

[repeat_label:] REPEAT

    statement_list

UNTIL expr_condition

END REPEAT [repeat_label]

上述语法格式中,repeat_label为REPEAT语句的注脚名称,该参数是可选的;REPEAT语句内的言语或语句群被另行,直至expr_condition为真。

【例6-10】演示使用REPEAT语句试行循环进程,具体代码如下:

DECLARE id INT DEFAULT 0;

    REPEAT

    SET id=id 1;

    UNTIL id>=10;

END REPEAT;

和大家地点分析的结果一律,只插入了数值0,1,2,4。

SELECT city_id FROM test.city

每一种流程中也许含有一个独自的口舌,也恐怕是接纳BEGIN···END构造的复合语句,能够嵌套。接下来将对准存款和储蓄进程中的流程序调节制语句逐条详细地解说。

在MySQL存款和储蓄进程的语句中有三个正式的轮回方式:WHILE循环,LOOP循环以至REPEAT循环。还也是有一种非标准的大循环境景况势:...

  彩民之家高手论坛 1

LOOP语句

LOOP循环语句用来重新施行有些语句,与IF和CASE语句相比较,LOOP只是创设三个循环操作的进程,并不开展规范剖断。LOOP内的言辞一向重复试行直到跳出循环语句。LOOP语句的骨干格式如下:

[loop_label:]LOOP

    statement_list

END LOOP  [loop_label]

上述语法格式中,loop_label表示LOOP语句的标号名称,该参数能够简轻易单;statement_list表示需求循环实行的话语。

【例6-8】使用LOOP语句举办巡回操作,具体代码如下:

DECLARE id INT DEFAULT 0;

add_loop:LOOP

SET id=id 1;

    IF id>=10 THEN LEAVE add_loop;

    END IF;

END LOOP add_loop;

例中,循环试行了id加1的操作。当id值小于10时,循环重复推行;当id值大于只怕等于10时,使用LEAVE语句退出循环。关于LEAVE语句就要底下举行详细的讲授。

mysql> call pro11()// Query OK, 1 row affected (0.00 sec) #固然在此边显得唯有一行数据遭到震慑,不过上面选拔数据以来,依然插入了5行数据。

2.2 CASE 语句

经过前边的就学,已经通晓了创立存储进程时所用到的基本知识,在编排存储进程时还应该有贰个老大主要的部分——流程序调控制。流程序调节制语句用于将八个SQL语句划分或组合成相符业务逻辑的代码块。MySQL中的流程序调整制语句包含:IF语句、CASE语句、LOOP语句、WHILE语句、LEAVE语句、ITERATE语句和REPEAT语句。

 

2.4  ITERATE语句

LEAVE语句

通过学习LOOP语句的应用可知,当不满足循环条件时,需求使用LEAVE语句退出循环。LEAVE语句用于退出别的被标记的流程序调整制构造,其基本语法格式如下:

LEAVE label

在上述语法结构中,label表示循环的标记。平常状态下,LEAVE语句与BEGIN···END、循环语句一齐利用。

彩民之家高手论坛 2

上面首先使用第一种循环编写五个例证。

2. 流水生产线调节

CASE语句

CASE是另八个进展标准判别的语句,该语句有二种语句格式,第一种格式如下:

CASE case_expr

    WHEN when_value THEN statement_list

    [WHEN when_value THEN statement_list]...

    [ELSE statement_list]

END CASE

在上述语法格式中,case_expr代表原则推断的表明式,决定了哪一个WHEN子句会被施行;when_value代表表明式大概的值,假如某些when_value表明式与case_expr说明式结果一致,则进行对应THEN关键字后的statement_list中的语句,statement_list表示分化when_value值的实践语句。

【例6-7】使用CASE流程调节语句的首先种格式,决断val值等于1、等于2,大概两方都不对等,语句如下:

CASE va1

    WHEN 1 THEN SELECT 'va1 is 1';

    WHEN 2 THEN SELECT 'va1 is 2';

    ELSE SELECT 'va1 is not 1 or 2';

END CASE;

在上述代码中,当val值为1时,输出字符串“val is 1”;当val值为2时,输出字符串“val is 2”;不然输出字符串“val is not 1 or 2”。

彩民之家高手论坛 3

CASE语句的第三种格式如下:

CASE

    WHEN expr_condition THEN statement_list

    [WHEN expr_condition THEN statement_list]

    [ELSE statement_list]

END CASE;

内需潜心的是,这里上课的用在蕴藏进程里的CASE语句与“调节流程函数”里描述的SQL CASE表明式中的CASE语句有些区别。存款和储蓄进程里的CASE语句不能有ELSE NULL子句,並且用END CASE替代END来终止。

 

2.5 repeat 语句

IF语句

IF语句是指假诺满足某种条件,就依赖剖断的结果为TRUE或FALSE执行相应的说话,其语法格式如下:

IF expr_condition THEN statement_list

    [ELSEIF expr_condition THEN statement_list]

    [ELSE statement_list]

END IF

IF实现了贰个基本的尺码构造。在上述语法结构中,expr_condition表示评定尺度,statement_list表示SQL语句列表,它能够包罗贰个或多少个语句。就算expr_condition求值为TRUE,相应的SQL语句列表就能被推行;若无expr_condition相称,则ELSE子句里的语句列表被实行。

急需静心的是,MySQL中还会有一个IF()函数,它不一样于这里描述的IF语句。

接下去演示贰个IF语句的用法,示例代码如下:

IF va1 IS NULL

    THEN SELECT 'va1 is NULL';

    ELSE SELECT 'va1 is  not NULL';

END IF;

上述代码中,推断val值是或不是为空,若是val值为空,输出字符串“val is NULL”;不然输出字符串“val is not NULL”。需求在意的是,IF语句都急需采纳END IF来收场,不可以小视。

彩民之家高手论坛 4

 

2.3  loop 语句

WHILE语句

WHILE语句创造三个带条件决断的循环进度,与REPEAT差异的是,WHILE在言语实行时,先对点名的表明式进行剖断,假设为真,则实施循环内的语句,不然退出循环。WHILE语句的骨干格式如下:

[while_label:] WHILE expr_condition DO

    Statement_list

END WHILE [while_label]

在上述语法格式中,while_label为WHILE语句的标记名称;expr_condition未开展推断的说明式,假诺表明式结果为真,WHILE语句内的言辞或语句群被推行,直至expr_condition为假,退出循环。

【例6-11】演示使用WHILE语句实行巡回操作,具体代码如下:

DECLARE i INT DEFAULT 0;

WHILE i<10 DO

SET i=i 1;

END WHILE;

mysql> call pro12// Query OK, 1 row affected (0.00 sec) #虽说说独有一行数据受影响,可是实际上是插入了5行数据。

彩民之家高手论坛 5

ITERATE语句

ITERATE的意趣是再一次循环、ITERATE语句用于将举行顺序转到语句段的开端处。使用ITERATE语句的基本语法格式如下:

ITERATE label

在上述语句结构中,label表示循环的表明。须求注意的是,ITERATE语句只可以够出现在LOOP、REPEAT和WHILE语句内。

【例6-9】演示了ITERATE语句在LOOP语句内的使用,具体代码如下:

CREATE PROCEDURE doiterate()

BEGIN

DECLARE p1 INT DEFAULT 0;

my_loop:LOOP

    SET p1=p1 1;

    IF p1<10 THEN ITERATE my_loop;

    ELSEIF p1>20 THEN LEAVE my_loop;

    END IF;

    SELECT 'p1 is between 10 and 20';

END LOOP my_loop;

END //

上述代码中,pl的开始值为0,如若pl的值小于10时,重复试行pl加1的操作;当pl大于或等于10相同的时候小于20时,打字与印刷音信“pl is between 10 and 20”;当pl大于20时,退出循环。

 

  富含 if ,case, loop, leave, iterate, repeat, while 语句进行流程序调整制

 

  在蕴藏进度和函数中能够使用光标对结果集进行巡回的处理,光标使用包纯钧标的表明,open ,fetch,close。
  上边在仓库储存进程中动用三个光标, 这几个比喻中光标里的逻辑不根本, 入眼在于怎么着行使光标:

再来看一后一次之个巡回调整指令 REPEAT……END REPEAT。使用REPEAT循环控制语句编写下边那么些蕴藏进程:

彩民之家高手论坛 6

 

  彩民之家高手论坛 7

ITERATE 迭代 

--  举例二种用法
CASE
WHEN i_staff_id = 2 THEN
    SET @x1 = @x1   d_amount;
ELSE
    SET @x2 = @x2   d_amount;
END CASE;
-- 或者:
CASE i_staff_id
WHEN 2 THEN
    SET @x1 = @x1   d_amount;
ELSE
    SET @x2 = @x2   d_amount;
END CASE;

 

1. 光标的采用(游标)

 

2.1  IF 语句

 

   loop 实现轻便的轮回,退出循环条件可以利用leave语句。

mysql> select * from t1// ——- | filed | ——- | 0 | | 1 | | 2 | | 4 | ——- 4 rows in set (0.00 sec)

 

这么些循环语句的格式如下: WHILE……DO……END WHILE REPEAT……UNTIL END REPEAT LOOP……END LOOP GOTO。

DELIMITER $$
CREATE PROCEDURE proc_demo_iterate()
BEGIN
    DECLARE increase INT DEFAULT 1;
    SET @x=0;
    ins: LOOP
      SET increase=increase 1;  
      IF increase =100 THEN
        -- 退出
        LEAVE ins;
      ELSEIF MOD(increase,2)=0 THEN
        -- 返回
        ITERATE ins;
      END IF;
      SET @x=@x 1;
     END LOOP ins;    
END $$
DELIMITER ;
-- 调用
CALL proc_demo_iterate;
SELECT @x;

再来看一下第八个循环调节语句LOOP……END LOOP。编写两个存款和储蓄进度程序如下: mysql> create procedure pro12() -> begin -> declare i int default 0; -> loop_label: loop -> insert into t1(filed) values(i); -> set i=i 1; -> if i>=5 then -> leave loop_label; -> end if; -> end loop; -> end;// Query OK, 0 rows affected (0.00 sec) 从上边这些例子能够见到,使用LOOP编写同样的循环调整语句要比使用while和repeat编写的要复杂一些:在循环之中参与了IF……END IF语句,在IF语句中又踏入了LEAVE语句,LEAVE语句的情趣是离开循环,LEAVE的格式是:LEAVE 循环标号。 编写完存款和储蓄进度程序后,来试行并查看一下运转结果: mysql> delete from t1// Query OK, 5 rows affected (0.00 sec)

  彩民之家高手论坛 8

mysql> create procedure pro10() -> begin -> declare i int; -> set i=0; -> while i<5 do -> insert into t1(filed) values(i); -> set i=i 1; -> end while; -> end;// Query OK, 0 rows affected (0.00 sec) 在这里个事例中,INSERT和SET语句在WHILE和END WHILE之间,当变量i大于等于5的时候就退出循环。使用set i=0;语句是为了防卫一个大规模的一无所能,若无带头化,i私下认可变量值为NULL,而NULL和任何值操作的结果都是NULL。 实践一下以此蕴藏进程并产看一下进行结果: mysql> delete from t1// Query OK, 0 rows affected (0.00 sec) mysql> call pro10()// Query OK, 1 row affected (0.00 sec) mysql> select * from t1// ——- | filed | ——- | 0 | | 1 | | 2 | | 3 | | 4 | ——- 5 rows in set (0.00 sec) 以上就是实践结果,有5行数据插入到数据库中,证明存款和储蓄进程编写准确精确^_^。

DELIMITER $$
CREATE PROCEDURE proc_demo_while()
BEGIN
     DECLARE increase INT DEFAULT 1;
     SET @x=0;
     WHILE increase<=10 DO
     SET increase=increase 1;
     SET  @x=@x increase;
     END WHILE;
END $$
DELIMITER ;

-- 调用
CALL proc_demo_while;
SELECT @x;

 

--  语法如下
IF search_condition THEN statement_list
[ELSE IF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
-- 举例
IF city_id_staff < 10 THEN 
    SET @result=@result 1;
ELSE 
    SET @result=@result 2;
END IF;

 

  有原则的大循环调节语句,当满意条件的时候退出循环,在地点的光标也是一种循环,使用repeat来退出光标,使用close来关闭光标。

 

-- 语法
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]

--  举例(UNTIL 0 END REPEAT)退出 当search_condition为0时,使用END REPEAT退出
    REPEAT
    FETCH  cur_city INTO city_id_staff;
         IF city_id_staff < 10 THEN 
         SET @result=@result 1;
         ELSE 
         SET @result=@result 2;
         END IF;
    UNTIL 0 END REPEAT;

假诺是在ITERATE语句,即迭代语句中的话,就务须利用LEAVE语句。ITERATE只好出现在LOOP,REPEAT和WHILE语句中,它的情趣是“再一次循环”,举个例子: mysql> create procedure pro15() -> 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(filed) values(i); -> set i=i 1; -> if i>=5 then -> leave loop_label; -> end if; -> end loop; -> end;// Query OK, 0 rows affected (0.00 sec) iterate语句和leave语句同样,也是在循环之中采取,它有一点点类似于C/C 语言中的continue。 那么那一个蕴藏程序是怎么运作的的?首先i的值为0,条件剖断语句if i=3 then推断为假,跳过if语段,向数据库中插入0,然后i 1,同样前面包车型地铁if i>=5 then推断也为假,也跳过;继续循环,同样插入1和2;在i=3的时候条件决断语句if i=3 then判定为真,施行i=i 1,i值为4,然后施行迭代iterate looplabel;,即语句实践到iterate looplabel;后一贯跳到if i=3 then判定语句,实践剖断,今年由于i=4,if i=3 then判定为假,跳过IF语段,将4增添到表中,i变为5,条件判别if i>=5 then决断为真,试行leave loop_label;跳出loop循环,然后实施end;//,截至全部存款和储蓄进度。 综上所述,数据库准将插入数值:0,1,2,4。实施存款和储蓄进程,并查看结果:| mysql> delete from t1// Query OK, 5 rows affected (0.00 sec)

DELIMITER $$
CREATE PROCEDURE proc_demo_cursor()
BEGIN
    -- 定义变量,获取光标中的数据
        DECLARE city_id_staff SMALLINT DEFAULT 0;

    -- 声明光标
    DECLARE cur_city CURSOR FOR SELECT city_id FROM test.city;

    -- 定义条件  没有找到数据时退出光标 NOT FOUND CLOSE cur_city
    DECLARE EXIT HANDLER FOR NOT FOUND CLOSE cur_city;    

    SET  @result=0;

    -- 打开光标
    OPEN cur_city;
    REPEAT
    FETCH  cur_city INTO city_id_staff;
         IF city_id_staff < 10 THEN 
         SET @result=@result 1;
         ELSE 
         SET @result=@result 2;
         END IF;
    UNTIL 0 END REPEAT;

    -- 关闭光标
    CLOSE cur_city;
END $$
DELIMITER ;

-- 调用
CALL proc_demo_cursor;
SELECT @result;

 

  ITERATE该语句必需用在循环中,功用也等于for 中的continue, 跳过当前循环剩下的语句,直接步向下一轮循环。

在MySQL存款和储蓄进度的讲话中有三个正规的大循环方式:WHILE循环,LOOP循环以至REPEAT循环。还会有一种非典型的巡回格局:GOTO,可是这种循环情势最佳别用,很轻巧引起程序的糊涂,在这里地就不错具体介绍了。

2.6 while 语句

mysql> call pro15// Query OK, 1 row affected (0.00 sec)

   也可以有规范的轮回调节语句,当满足条件的时候退出循环。WHILE 循环和REPEAT 循环的分别在于:WHILE 是满意条件才试行循环,REPEAT 是满意条件退出循环;WHILE 在第贰遍巡回执行在此之前就推断规范,所以循环起码试行0 次,而REPEAT 是在第一回推行循环之后才看清标准,所以循环起码施行1 次。 相当于开荒语言的while(bool) 和do while(bool)。

mysql> select * from t1// ——- | filed | ——- | 0 | | 1 | | 2 | | 3 | | 4 | ——- 5 rows in set (0.00 sec) 奉行结果和选取WHILE、LOOP编写的循环同样,皆未来标中插入5行值。

 

 

Labels 标号和 END Labels 停止标号 在应用loop的时候,使用到的labels标号,对于labels能够用到while,loop,rrepeat等循环调整语句中。何况有不能缺少能够认知一下lables!! mysql> create procedure pro13() -> label_1:begin -> label2:while 0=1 do leave label2;end while; -> label3:repeat leave label3;until 0=0 end repeat; -> label4:loop leave label4;end loop; -> end;// Query OK, 0 rows affected (0.00 sec) 上边这里例子展现了可以在BEGIN、WHILE、REPEAT大概LOOP语句前应用语句标号,语句标号只好在法定的言辞前使用,所以LEAVE label3表示间距语句标号名称为label3的讲话或符合语句。 其实,也能够选取END labels来代表标号截止符。 mysql> create procedure pro14() -> label_1:begin -> label2:while 0=1 do leave label2;end while label_2; -> label3:repeat leave label3;until 0=0 end repeat label_3; -> label4:loop leave label4;end loop label_4; -> end label_1;// Query OK, 0 rows affected (0.00 sec) 上边便是利用了标明甘休符,其实这几个结束标号实际不是特别有用,何况他必得和起来定义的注脚名字一样,不然就能够报错。倘使要养成二个特出的编程习于旧贯方便客人阅读的话,能够使用那些标号结束符。

mysql> select * from t1// ——- | filed | ——- | 0 | | 1 | | 2 | | 3 | | 4 | ——- 5 rows in set (0.00 sec) 一行正是实践结果,实际的坚守和应用while编写的存款和储蓄进程一样,都以插入5行数据。

MySQL存储进程中的3种循环

mysql> create procedure pro11() -> begin -> declare i int default 0; -> repeat -> insert into t1(filed) values(i); -> set i=i 1; -> until i>=5 -> end repeat; -> end;// Query OK, 0 rows affected (0.00 sec) 那几个REPEAT循环的效劳和近年来WHILE循环一样,不一致在于它的进行后检查是或不是知足循环条件(until i>=5),而WHILE则是实施前检查(while i<5 do)。 可是要留意until i>=5前边不要加分号,如果加分号,就是唤醒语法错误。 编写成功后,调用一下以此蕴藏进度,并查阅结果: mysql> delete from t1// Query OK, 5 rows affected (0.00 sec)

TAG标签: MySQL教学困境
版权声明:本文由彩民之家高手论坛发布于彩民之家高手论坛,转载请注明出处:流程控制的使用彩民之家高手论坛