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 标记的代码段离开

-- By 许望(RHCA、OCM、VCP)
最后修改:2020 年 01 月 17 日 02 : 54 PM
如果觉得我的文章对你有用,请随意赞赏