mysql存储过程、存储函数(二):流程控制语句

MySQL流程控制语句是用来控制语句的执行,构造控制流程的语句有:

IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句、REPEAT语句和WHILE语句,

本文主要说明流程控制语句中的 循环语句。

1、条件语句

1.1、if-then -else语句

语法:

IF (expr_condition) THEN
    ....do something.....
ELSEIF (expr_condition) THEN
    ....do something.....
ELSE
    ....do something.....
END IF;

示例: 

DELIMITER $$  
CREATE PROCEDURE proc1(IN parameter int)  
   begin 
       declare var int;  
       set var=parameter+1;  
       if var=0 then 
            insert into test values(17);  
       end if;  
       if parameter=0 then 
            update t set s1=s1+1;  
       else 
            update t set s1=s1+2;  
       end if;  
   end;  
   $$  
DELIMITER ; 

 1.2、case语句:

CASE语句有两种语法格式:

CASE
    WHEN expr_condition THEN ...do something...
    WHEN expr_condition THEN ...do something...
    ....多个 WHEN THEN 语句.....
        [ELSE ...do something...]
END CASE;

其中expr_condition为条件表达式,计算结果为true,则执行THEN后面的语句。多个WHEN...THEN依次执行,ELSE为可选条件。

另外一种语法格式:

CASE case_expr
    WHEN expr THEN .....do something....
    WHEN expr THEN .....do something...
    ....多个表达式...
    [ELSE ...dosomething..]
END CASE;

其中,case_expr表示条件判断的表达式,WHEN后的表达式结果如果和case_expr匹配,则执行相应的THEN后面的语句。没有则执行ELSE,ELSE为可选。
这种语法类似switch...case(建议使用第一种,逻辑清晰一点)。
DELIMITER $$  
CREATE PROCEDURE proc1(IN parameter int)  
    begin 
        declare var int;  
        set var=parameter+1;  
        case var  
        when 0 then   
            insert into t values(17);  
        when 1 then   
            insert into t values(18);  
        else   
            insert into t values(19);  
        end case;  
    end;  
    $$  
DELIMITER ; 

2、循环语句

2.1、WHILE循环(先判断再执行)

2.1.1、语句结构:

[WHILE标注] : WHILE 条件表达式 DO

    执行语句

UNTIL 条件表达式

END REPEAT [REPEAT标注]

其中,“WHILE标注”  为可选,表示WHILE循环语句的标签。WHILE的执行过程是,先判断条件表达式 expr_condition,如果为true执行循环,否则结束循环(与REPEAT的区别是:WHILE先判断条件,REPEAT是后判断条件)。

2.1.2、创建存储过程示例

drop procedure if exists test;           -- 如果存在test存储过程则删除
delimiter $$                             -- 定义标识符为$$
create procedure test()                  -- 创建无参存储过程,名称为test
begin
    declare i int default 5;             -- 申明变量
    while i < 10 do                      -- 结束循环的条件: 当i大于10时跳出while循环
        insert into test values (i);    -- 往test表添加数据
        set i = i + 1;                   -- 循环一次,i加一
    end while;                           -- 结束while循环
    select * from test;                 -- 查看test表数据
end;
$$                                       -- 结束定义语句
delimiter ;

调用存储过程:

call test();                            #调用存储过程

2.2、repeat循环(先执行再判断)

它在执行操作后检查结果,而while则是执行前进行检查。

2.2.1、语句结构

[REPEAT标注]:REPEAT

    执行语句

UNTIL 条件表达式

END REPEAT [REPEAT标注]

其中, “REPEAT标注” 为可选,表示REPEAT循环语句的标签,UNTIL指定循环条件。

REPEAT执行过程是:每次循环体执行完毕需要去判断一下条件表达式expr_condition,如果为true继续执行,否则结束循环。

2.2.2、 创建存储过程示例

drop procedure if exists test;   -- 如果存在test存储过程则删除
delimiter $$                            -- 定义标识符为双斜杠
create procedure test()                 -- 创建无参存储过程,名称为test
begin
    declare i int default 6;            -- 申明变量
    repeat
        insert into test values (i);    -- 往test表添加数据
        set i = i + 1;                  -- 循环一次,i加一
    until i > 10 end repeat;            -- 结束循环的条件: 当i大于10时跳出repeat循环
    select * from test;                 -- 查看test表数据
end;
$$										-- 结束定义语句
delimiter ;

调用存储过程:

call test();                            #调用存储过程

 

2.3、loop循环

loop循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环。

2.3.1、语句结构

[loop标注]:LOOP

    执行语句

END LOOP [loop标注]

2.3.2、 创建存储过程示例

drop procedure if exists test;          -- 如果存在test存储过程则删除
delimiter $$                           -- 定义标识符为双斜杠
create procedure test()                 -- 创建无参存储过程,名称为test
begin
    declare i int default 7;            -- 申明变量
    lp : loop                           -- lp为循环体名,可随意 loop为关键字
        insert into test values (i);    -- 往test表添加数据
        set i = i + 1;                  -- 循环一次,i加一
        if i > 10 then                  -- 结束循环的条件: 当i大于10时跳出loop循环
            leave lp;
        end if; 
    end loop;
    select * from test;                 -- 查看test表数据
end;
$$                                      -- 结束定义语句
delimiter ;

调用存储过程:

call test();                            #调用存储过程

 

 2.4、ITERATE语句

再次循环,将执行顺序转到语句开头处,只能用于LOOP,REPEAT和WHILE语句内。(类似于其他代码语言的continue)

2.4.1、语句结构

ITERATE [LOOP/REPEAT/WHILE标注]

  2.4.2、创建存储过程示例

drop procedure if exists test;          -- 如果存在test存储过程则删除
delimiter $$                            -- 定义标识符为双斜杠
create procedure test()                 -- 创建无参存储过程,名称为test
begin
    declare i int(11) default 0;        -- 申明变量
    myloop:loop
          set i = i + 1;
          if i < 5 then iterate myloop;
          elseif i > 8 then leave myloop;
          end if;
          insert into test values (i); 
    end loop myloop;
    select * from test;  
end;
$$
delimiter  ;                           -- 结束定义语句

调用存储过程:

call test();                            #调用存储过程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值