15 存储过程
概念
存储过程:是在大型数据库系统中,一组为了完成特定功能的sql语句集,存储在数据库中,经过第一次编译后再次调用不需要重复编译,用户通过指定存储过程的名字并给出参数(如果存储过程有参数)来执行。
存储过程基本上可以完成大部分的函数可以处理的功能
与函数的异同
相同点
存储过程和函数都是为了重复地执行操作数据库sql语句的集合
存储过程和函数都是一次编译,后续执行
不同点
-
标识符不同:函数标识符是function,存储过程是procedure
-
函数中有返回值,而且必须返回,存储过程没有返回值
-
存储过程没返回值,不能将结果直接赋值给变量;函数是有返回值的,调用时,除了在select中,必须将返回值赋值给变量
-
函数可以在select语句中直接使用,存储过程不可以
创建过程
-- 创建存储过程
delimiter $$
create procedure 过程名称(参数列表)
begin
过程体
end
$$
delimiter ;
-- 如果过程体中,只有一条指令,可以省略begin和end
create procedure 过程名称(形参)
过程体
查看过程
方式一:通过查看过程状态,查看素所有存储过程
show procedure status [like '匹配模式']
方式二:通过 过程创建语句
show create procedure 过程名;
调用过程-call
call 存储过程的名(实参列表);
删除过程
drop procedure 存储过程名;
存储过程的形参类型
存储过程的形参类型主要分为3类:
in-值传递
表示参数从外面传入到过程内部使用,可以是直接的结果数据,也可以是保存数据的变量
out-引用传递
表示参数从过程里面把数据保存到变量中,供给外部使用
如果传入的out变量本身在外部有数据,那么在进入过程后就会被清空,设置为null
out变量必须是外部定义的变量
inout-引用传递
数据可以从外部传入到过程内部使用,同时内部操作后,也可以将数据返还给外部
过程类型 变量名 数据类型
-- -------------------------- 存储过程形参
set @n1=1;
set @n2=1;
set @n3=1;
CREATE PROCEDURE my_pro(in int_1 int,out int_2 int,INOUT int_3 int)
BEGIN
-- 查看传入的变量的值
SELECT int_1,int_2,int_3; -- 输出 1 null 1
-- 当out或inout类型的变量传入后,此时并没有改变外部变量的值,而是把值传递给了形参变量
-- 但是形参会将out类型的值清空为null
-- 修改三个变量的值
set int_1=10;
set int_2=100;
set int_3=1000;
-- 查看会话变量的值
SELECT int_1,int_2,int_3; -- 输出 10 100 100
-- 修改会话变量的值
set @n1='a1';
set @n2='a2';
set @n3='a3';
-- 查看会话变量的值
SELECT @n1,@n2,@n3; -- 输出 a1 a2 a3
-- 走到end表示过程结束:
-- 开始工作,判断传递过来的变量是否是out类型或inout类型
-- 如果是,将内部代替out和inout变量的对应形参的值重新赋值给外部变量(就是会覆盖外部变量本身的值)
END
-- 重置
set @n1=1;
set @n2=1;
set @n3=1;
SELECT @n1,@n2,@n3; -- 输出 1 1 1
CALL my_pro(@n1,@n2,@n3);
SELECT @n1,@n2,@n3; -- 输出a1 100 1000