MySQL数据库-存储过程-条件判断、循环

爱丽思 25天前 ⋅ 87 阅读

if判断语法

语法

IF 条件1 THEN 
 ...
ELSEIF 条件2 THEN
 ...
ELSEIF 条件2 THEN
 ...
ELSE
 ...
END IF;

例子:通过定义份数变量 score 判定当前份数变量等级,大于85优秀,大于60及格,小于60不及格


-- 创建存储过程
CREATE PROCEDURE grade_level()
begin
  declare score int default 58;
  declare result varchar(10);
  
  if score >= 85 then 
    set result := '优秀';
  elseif score >= 60 then 
    set result := '及格';
  else 
    set result := '不及格';
  end if;
end;

-- 调用存储过程
call grade_level();

CASE语法

语法一

CASE case_value
  WHEN when_value THEN ....
  WHEN when_value THEN ....
  ELSE ...
END CASE;

语法二

和语法一区别在于没有 case_value

CASE 
  WHEN when_value THEN ....
  WHEN when_value THEN ....
  ELSE ...
END CASE;

例子:输入月份返回季度

-- 创建存储过程
CREATE PROCEDURE month2quarterly(in month int , out result varchar(50))
BEGIN
  CASE 
    WHEN month >= 1 and month <=3 THEN 
      set result := '季度一';
    WHEN month >= 4 and month <=6 THEN 
      set result := '季度二';
    WHEN month >= 7 and month <=9 THEN 
      set result := '季度三';
    WHEN month >= 10 and month <=12 THEN 
      set result := '季度四';
    ELSE 
      set result := '非法月份输入值!';
  END CASE;
  select @result;
END;
-- 调用存储过程
set @result := '';
call month2quarterly(1 , @result);
-- 查看执行结果
select @result;

WHILE循环

while循环是有条件的循环控制语句,满足条件后,再执行循环体中的SQL语句,具体语法如下:

-- 先判定条件,如果为true,则执行逻辑,否则不执行逻辑
while 条件 do
  SQL逻辑
end while;

例子:计算1到n的累加值。

-- 创建存储过程
create procedure compute_add(in n int)
begin
  -- 定义局部变量 存储累加值
  declare total int default 0;
  while n > 0 do
    set total := total + n;
    set n := n-1;
  end while;
  select total;
end;

-- 调用存储过程
call compute_add(8);

REPEAT 循环

repeat循环时有条件的循环控制语句,当满足条件的时候退出循环,具体语法如下:

-- 先执行一次逻辑,然后判定逻辑是否满足,如果满足,则退出,如果不满足,则继续下一次循环
repeat 
  SQL逻辑
  until 条件
end repeat;

例子:计算1到n的累加值。

-- 创建存储过程
create procedure compute_add_repeat(in n int)
begin
  declare total int default 0;
  repeat 
    set total := total + n;
    set n := n-1;
    -- 注意这里的条件后面不需要加 ; 号
    until n <= 0
  end repeat;
  select total;
end;

-- 调用存储过程
call compute_add_repeat(10);

LOOP循环

loop实现简单循环,如果不在SQL逻辑中退出循环条件,可以使用其来时间简单的死循环。loop可以配合一下两个语句使用:

  • leave : 配合循环使用,退出循环。
  • iterate:必须用在循环中,作用时跳过当前循环剩下的语句,直接进入下一次循环。

语法

[begin_label:] loop
  SQL逻辑
end loop [end_label];
leave label; -- 退出指定标记的循环体;
iterate label;  -- 直接进入下一次循环体

例子:计算1到n的累加值。

-- 定义存储过程
create procedure compute_loop_leave(in n int)
begin
  -- 定义局部变量统计累加值
  declare total int default 0; 
  -- 给loop循环定义标记 sun
  sum:loop
    set total := total + n;
    set n := n - 1;
    -- 判断是否达到跳出循环条件
    if n <= 0 then 
      leave sum;
    end if;
  end loop sum;
  -- 查询循环结果
  select total;
end;

-- 调用存储过程
call compute_loop_leave(10);

例子二:计算1到n的偶数和;

-- 定义存储过程
create procedure compute_loop_iterate(in n int)
begin
  -- 定义局部变量统计累加值
  declare total int default 0; 
  -- 给loop循环定义标记 sun
  sum:loop
	if n % 2 = 1 then 
		set n := n-1;
		iterate sum;
	end if;
    set total := total + n;
    set n := n - 1;
    -- 判断是否达到跳出循环条件
    if n <= 0 then 
      leave sum;
    end if;
  end loop sum;
  -- 查询循环结果
  select total;
end;

-- 调用存储过程
call compute_loop_iterate(4);