「MySQL 基础」存储过程流程控制语句讲解

90 阅读3分钟

🙏废话不多说系列,直接开整🙏

女19.jpg

(1)if else 流程控制

-- 语法格式如下:
IF search_condition THEN 
    statement_list  
[ELSEIF search_condition THEN]  
    statement_list ...  
[ELSE 
    statement_list]  
END IF 

-- 示例:( 新建一个函数,用来测试 if elseif else)
drop function if exists func_ifelse_demo ;

create function func_ifelse_demo(`num` int) returns varchar(1000)
begin
	# 判断成绩等级
	declare info varchar(1000) default '';
	set info = '';
	if num >= 80 and num <= 100 then set info = '成绩优秀';
	elseif num >= 60 and num < 80 then set info = '成绩及格';
	elseif num >= 0 and num < 60 then set info = '成绩不及格';
	else set info = '成绩异常';
	end if;
	return info;
end

select func_ifelse_demo(100); -- 成绩优秀

(2)while 循环

--- while 语法
WHILE [condition_statement] DO
	[statement];
END WHILE;

-- 示例:while 循环测试
drop function if exists func_while_demo;

create function func_while_demo(`num` int) returns int
begin
	# 累计求和 1+2+...+num
	declare sum int default 0;
	declare i int default 1;
	while i<=num do
		set sum = sum + i;
		set i = i + 1;
	end while;
	return sum;
end

select func_while_demo(10); -- 55

(3)case  when  then

-- 存储过程 / 函数 中的 case 用法
CASE  val
    WHEN  1  THEN  SELECT  'val is 1' ;
    WHEN  2  THEN  SELECT  'val is 2' ;
    ELSE  SELECT  'val is not 1 or 2 ' ;
END CASE;

-- 示例2:
drop function if exists func_case_demo;

create function func_case_demo(score int) returns char deterministic
begin
	case
	when score >= 90 and score <= 100 then return 'A';
	when score >= 80 then return 'B';
	when score >= 60 then return 'C';
	else return 'D';
	end case;
end

select func_case_demo(89);

-- 示例2:SQL中的直接查询替换值得用法
select 
	stu_id,
	stu_name,
	case
        when stu_age < 50 then '< 50'
        when stu_age = 50 then '= 50'
        when stu_age > 50 then '> 50'
	end stu_age
from student s ;

测试结果:

image.png

(4)Loop 循环

-- 语法格式:
[ loop_label:  ] LOOP
    statement_list ;
END LOOP  [ loop label ]

-- 示例:新建一个函数,用来测试 loop 循环
drop function if exists func_loop_demo;

create function func_loop_demo(`num` int) returns int
begin
	# 累计求和 1+2+...+num
	declare id int default 1;
	declare sum int default 0;
	add_loop: loop
		set sum = sum + id;
		set id = id + 1;
		if id > num then leave add_loop;  # leave 关键字:指定此处离开此loop循环,配合loop使用。
		end if;
	end loop add_loop;
	return sum;
end

select func_loop_demo(5); -- 10 = 1,2,3,4,5

(5)iterate 再次循环

-- iterate 语句:将执行顺序转到语句端的开头,语句的基本格式如下:
-- ITERATE label
-- iterate 只可以出现在 LOOP、REPEAT、WHILE 语句内。iterate 的意思为“再次循环”,label 参数标识循环的标识。

-- 示例:
drop procedure if exists proc_doIterate_demo;

create procedure proc_doIterate_demo()
begin
	declare i int default 0;
	my_loop: loop
		set i = i + 1;
		if i < 10 then iterate my_loop ;
		elseif i > 20 then leave my_loop;
		end if;
		select 'i is between 10 and 20';
	end loop my_loop;
end

-- 使用方法
call proc_doIterate_demo();

显示结果:

image.png

(6)repeat 语句

-- repeat 语句
-- repeat 语句创建一个待条件判断的循环过程,
-- 		每次语句执行完毕之后,会对条件表达式进行判断,
-- 			如果表达式为真,则循环结束;
-- 			如果表达式为假,则重复执行循环中的语句。

-- 语法:
--     [ repeat_label: ] REPEAT 
--         statement_list
--     UNTIL expr_condition
--     END  REPEAT  [ repeat_label ]

-- 示例:
drop function if exists func_repeat_demo;

create function func_repeat_demo(`num` int) returns int
begin
	declare id int default 0;
	declare sum int default 0;
	repeat
		set sum = sum + id;
		set id = id + 1;
	UNTIL id >= num
	end repeat;
	return sum;
end

select func_repeat_demo(30000); -- 449985000

测试结果:

image.png

(7)leave 语句

-- leave 语句
-- (1)leave 语句用来退出任何被标注的流程控制构造。
-- (2)leave 语句语法基本格式如下:
-- leave label  -- label 参数标识循环的标志。leave 和 begin...end 或 循环一起被使用。

-- 示例
drop function if exists func_leave_demo;

create function func_leave_demo() returns int
begin
	declare count int default 0;
	add_num: loop
		set count = count + 1;
		if count = 50 then leave add_num ;
		end if;
	end loop add_num;
	return count;
end

select func_leave_demo();

测试结果:

image.png

扩展

-- 显示所有的函数:
SHOW FUNCTION STATUS; -- 显示当前环境下的数据库的所有库的所有存储函数

-- 显示所有的存储过程:
SHOW PROCEDURE STATUS;


🙏至此,非常感谢阅读🙏

女19.jpg