MySQL的存储过程在生产中用得很少。
存储过程介绍
- 存储在数据库端的一组SQL语句集,是用户可以通过存储过程名和传参多次调用的程序模块
存储过程的特点:
- 使用灵活,可以使用流控语句、自定义变量等完成复杂的业务逻辑;
- 提高数据安全性,屏蔽应用程序直接对表的操作,易于进行审计;
- 减少网络传输;
- 提高代码维护的复杂度,实际使用需要结合业务评估;
语法
可以通过 HELP CREATE PROCEDURE 查看语法。
查看存储过程
通过 INFORMATION_SCHEMA.ROUTINES 来查看所有的存储过程发生。
使用 show create procedure xxx 查看某个存储过程的定义。
调用存储过程
call 过程名(参数);
IF
语法:
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
示例:
delimiter //
create procedure pcd_test_1 (in param_a int)
begin
declare a int;
if param_a > 10 then set a:=11;
elseif param_a = 10 then set a:=10;
else set a:=9;
end if;
end;//
CASE
语法:
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE
-- 或
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
示例:
delimiter //
create procedure pcd_test_1(in param_a int)
begin
case param_a
when 2 then select 200;
when 3 then select 300;
else
begin
end;
end case;
end;//
可以不写 else,与可以在 else 中写一个空事务,表示什么也不做。
WHILE
语法:
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
示例:
delimiter //
create procedure pcd_test_1(in param_1 int)
begin
declare a int default 1;
while param_1 > 10 do
set param_1 = param_1 - 1;
set a = a + 1;
end while;
select a;
end;//
REPEAT/UNTIL
语法:
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
示例:
delimiter //
create procedure pcd_test_1(in param_1 int)
begin
SET @x = 0;
REPEAT
SET @x = @x + 1;
UNTIL @x > param_1 END REPEAT;
end;//
delimiter ;
LOOP
语法:
[begin_label:] LOOP
statement_list
END LOOP [end_label]
示例:
delimiter //
create procedure pcd_test_1(in param_1 int)
begin
test_label: loop
set param_1 := param_1 + 1;
if param_1 < 10 then
iterate test_label;
end if;
leave test_label;
end loop test_label;
set @x = param_1;
end;//
-- ITERATE 和label相结合,表示继续从label处执行
-- LEAVE 和label相结合,表示从label 标记的代码段离开