Skip to content

存储过程

相比Oracle, MySQL中很少使用存储过程。

1. 概述

  1. 存储在数据库端的一组SQL语句集
  2. 用户可以通过存储过程名和传参多次调用的程序模块
  3. 存储过程的特点:
  • 使用灵活,可以使用流控制语句、自定义变量等完成复杂的业务逻辑
  • 提高数据安全性,屏蔽应用程序直接对表的操作,易于进行审计
  • 减少网络传输
  • 但是提高代码维护的复杂度,实际使用中要评估场景是否适合

1. 存储过程之流控制

流程控制语法
ifIF search _condition THEN statement list
[ELSElF search condition THEN statement list] [ELSE statement list]
END IF
caseCASE case__value
WHEN when_value THEN statement list
[ELSE statement_list] END CASE
whileWHILE search_condition DO statement list
END WHILE
repeatREPEAT statement listUNTlL search condition
END REPEAT

2. 存储过程之基本语法

Alt text

3. 存储过程之实操

3.1 创建存储过程

sql
DELIMITER //
create procedure sql_trains.proc_test1(in total int, out res int)
begin
	declare i int;
    set i=1;
    set res = 1;
    if total <= 0 then 
		set total = 1;
	end if;
    while i <= total do
		set res = res * i;
        insert into sql_trains.tbl_proc_test values (res);
        set i=i+1;
	end while;
    select max(num) from sql_trains.tbl_proc_test;
end; //
delimiter ;

其中使用delimiter定义语句结束符不再是;结尾,避免语句块录入时被误认为是单个sql。

sql
call sql_trains.proc_test1(10, @a);
-- 获取结果
select @a;

3.2 查询存储过程

sql
-- 查询具体存储过程状态
show procedure status like '%proc%';
-- 查询具体存储过程信息
select * from information_schema.routines where routine_schema='sql_trains';
-- 在mysql5.7之前,存储过程信息存放在 mysql.proc 表中
SELECT * FROM mysql.proc WHERE db = 'sql_trains;