文章目录
1 分类
解决复杂问题不可能通过一个SQL语句完成,我们需要执行多个SQL操作。流程控制语句的作用就是控制存储过程中SQL语句的执行顺序,是我们完成复杂操作必不可少的一部分。只要是执行的程序,流程就分为三大类:
- 顺序结构:程序从上往下依次执行
- 分支结构:程序按条件进行选择执行,从两条或多条路径中选择一条执行
- 循环结构:程序满足一定条件下,重复执行一组语句
2 语句
- 条件判断语句:IF语句和CASE语句
- 循环语句:LOOP、WHILE和REPEAT语句
- 跳转语句:ITERATE和LEAVE语句
3 分支结构
3.1 IF
3.1.1 语法
IF 表达式1 THEN 操作1
[ELSE 表达式2 THEN 操作2]......
[ELSE 操作N]
END IF
3.1.2 举例
# 情况1
create procedure test_if()
begin
#声明变量
declare stu_name varchar(15);
#使用if判断
if stu_name is null
then select 'stu_name is null';
end if;
end;
# 情况2:二选一
create procedure test_if2()
begin
#声明变量
declare stu_name varchar(15) default '张三';
#使用if判断
if stu_name is null
then select 'stu_name is null';
else
select 'stu_name is not null';
end if;
end;
#情况3:多选一
create procedure test_if3()
begin
#声明变量
declare age int default 50;
#使用if判断
if age > 40
then select '中老年';
elseif age < 40 and age >20
then select '青年';
elseif age < 20
then select '少年';
else
select '老年';
end if;
end;
3.2 CASE
3.2.1 语法
#情况一:类似于switch
CASE表达式
WHEN 值1 THEN 结果1或语句1(如果是语句,需要加分号)
WHEN 值2 THEN 结果2或语句2(如果是语句,需要加分号)
ELSE 结果n或语句n(如果是语句,需要加分号)
END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)
#情况二:类似于多重if
CASE
WHEN 条件1 THEN 结果1或语句1(如果是语句,需要加分号)
WHEN 条件2 THEN 结果2或语句2(如果是语句,需要加分号)
ELSE 结果n或语句n(如果是语句,需要加分号)
END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)
3.2.1 举例
#情况1
create procedure test_case()
begin
declare var int default 2;
case var
when 1 then select 'var = 1';
when 2 then select 'var = 2';
else select 'other var';
end case;
end;
call test_case2;
#情况2
create procedure test_case2()
begin
declare var int default 10;
case when var > 100 then select 'var > 100';
when var > 10 and var < 100 then select '100 > var > 10';
else select 'other var';
end case;
end;
4 循环结构
4.1 LOOP
4.1.1 语法
[loop_lable:]LOOP
循环体执行的语句
END LOOP[loop_lable]
4.1.2 举例
create procedure test_loop()
begin
declare num int default 1;
loop_label:loop
#重新赋值
set num = num + 1;
if num >= 10 then leave loop_label;
end if;
end loop loop_label;
#查看
select num;
end;
call test_loop;
4.2 WHILE
4.2.1 语法
[while_label:] WHILE 循环条件 DO
循环体
END WHILE [while_label];
4.2.2 举例
CREATE PROCEDURE test_while () BEGIN
DECLARE
num INT DEFAULT 1;
WHILE
num <= 10 DO
#循环体(略)
SET num = num + 1;#迭代条件
END WHILE;
SELECT num;
END;
4.3 REPEAT
4.3.1 语法
[repeat_label:] REPEAT
循环体的语句
UNTIL 结循环的条件表达式
END REPEAT [repeat_label]
4.3.2 举例
CREATE PROCEDURE test_repeat () BEGIN
DECLARE
num INT DEFAULT 1;#声明变量
SET num = num + 1;
REPEAT
UNTIL num >= 10#结束循环的条件,不要加分号
END REPEAT;
SELECT
num;
END;
CALL test_repeat;
4.4 循环结构的四个要素
- 初始化条件
- 循环条件
- 循环体
- 迭代条件