存储过程简称过程,procedure,是一种用来处理数据的方式。
存储过程是一种没有返回值的函数。
创建过程Create procedure 过程名字([参数列表])
Begin
-- 过程体
End
-- 创建存储过程
create procedure pro1() -- 假设过程中需要显示数据:使用select
select * from my_student;
函数的查看方式完全适用于过程:关键字换成procedure
查看所有过程:show procedure status[like 'pattern'];
-- 查看过程
show procedure status like 'pro%'\G
查看过程创建语句:show create procedure 过程名;
-- 查看过程创建语句
show create procedure pro1\G
过程没有返回值:select是不能访问的。
过程有一个专门的调用关键字:call
-- 调用过程
call pro1();
过程只能先删除,后新增
Drop procedure 过程名;
-- 删除过程
drop procedure pro1;
show procedure status\G
函数的参数需要数据类型指定,过程比函数更严格。
过程还有自己的类型限定:三种类型
In:数据只是从外部传入给内部使用(值传递):可以是数值也可以是变量。
out:只允许过程内部使用(不用外部数据),给外部使用的。(引用传递:外部的数据会被先清空才会进入到内部):只能是变量。
Inout:外部可以在内部使用,内部修改也可以给外部使用:典型的引用传递:只能传变量
基本使用
Create procedure 过程名(in 形参名字 数据类型,out 形参名字 数据类型,inout 形参名字 数据类型)
-- 过程参数
delimiter $$
create procedure pro1(in int_1 int,out int_2 int,inout int_3 int)
begin
-- 先查看三个变量
select int_1,int_2,int_3; -- int_2的值一定是NULL
end
$$
delimiter ;
调用:out和inout类型的参数必须传入变量,而不能是数值
call pro1(1,2,3);
-- 设置变量
set @int_1 = 1;
set @int_2 = 2;
set @int_3 = 3;
select @int_1,@int_2,@int_3;
call pro1(@int_1,@int_2,@int_3 );
select @int_1,@int_2,@int_3;
存储过程对于变量的操作(返回)是滞后的:是在存储过程调用结束的时候,才会重新将内部修改的值赋值给外部传入的全局变量。
-- 过程参数
delimiter $$
create procedure pro1(in int_1 int,out int_2 int,inout int_3 int)
begin
-- 先查看三个变量
select int_1,int_2,int_3; -- int_2的值一定是NULL(三个当前是局部变量)
-- 修改局部变量
set int_1 = 10;
set int_2 = 100;
set int_3 = 1000;
-- 查看局部变量
select int_1,int_2,int_3;
-- 查看全局变量
select @int_1,@int_2,@int_3;
-- 修改全局变量
set @int_1 = 'a';
set @int_2 = 'b';
set @int_3 = 'c';
-- 查看全局变量
select @int_1,@int_2,@int_3;
end
$$
delimiter ;
测试:传入数据1,2,3:说明局部变量与全局变量无关
-- 设置变量
set @int_1 = 1;
set @int_2 = 2;
set @int_3 = 3;
call pro1(@int_1,@int_2,@int_3);
最后:在存储过程调用结束之后,系统会将局部变量重复返回给全局变量(out和inout)