自身对存储过程概念的理解:
-- 存储过程
不同点:
-- 标识符不同:函数是FUNCTION 存储过程是PROCEDURE
-- 函数有返回值,且必须有返回,存储过程是没有返回值的
-- 函数可以在select中使用,存储过程不行
相同点:
-- 和函数的目的都是为了可重复执行操作数据库的sql语句的集合
-- 和函数都是一次编译,后续执行
存储过程的形参类型:
IN
表示参数从外部传入到里面使用(也就是存储过程的内部使用),可以是直接数据也可以是保存数据的变量
OUT
表示参数从过程里面把数据保存到变量中,交给外部使用,传入的必须是变量
如果传入的out变量本身在外部有数据,那么在进入过程之后,第一件事就是被清空,设为null
INOUT
数据可以从外部传入到内部使用,同时内部操作之后,又会将数据返还给外部
语法:
如果过程体 只有一条指令 则不需要BEGIN 和 END
CREATE PROCEDURE 过程名 ([参数列表])
BEGIN
过程体
END
应用示例:求1到100的和 (注意存储过程中的while用法)
delimiter $$
CREATE PROCEDURE my_pro()
BEGIN
-- 求1到100之间的和
DECLARE i int DEFAULT 1;
set @sum = 0;
while i<=100 DO
set @sum = @sum+i;
set i = i+1;
end WHILE
SELECT @sum
END
$$
delimiter ;
查看所有存储过程
show PROCEDURE STATUS
查看名为ad这个存储过程的创建语句
SHOW CREATE PROCEDURE ad
调用过程
call 存储过程名([参数列表])
删除存储过程
drop PROCEDURE 存储过程名
复杂应用示例(存储过程的形参运用):
-- 创建三个外部变量
set @n1 = 1;
set @n2 = 2;
set @n3 = 3;
delimiter $$
CREATE PROCEDURE my_pro(in int_1 int,out int_2 int,inout int_3 int)
begin
-- 查看三个传入进来的数据的值
select int_1,int_2,int_3;
-- 修改三个变量的值
set int_1 = 10;
set int_2 = 100;
set int_3 = 1000;
select int_1,int_2,int_3;
-- 查看会话变量
select @n1,@n2,@n3;
-- 修改会话变量
set @n1 = 'a';
set @n2 = 'b';
set @n3 = 'c';
SELECT @n1,@n2,@n3;
END
$$
delimiter;
-- 调用过程
call my_pro(@n1,@n2,@n3)
结果是 1 ,null,3 (@n1等于1又是in类型 所以是直接传入,@n2为out类型会清除为null,@n3是inout也会传入)
select @n1,@n2,@n3
结果是 a,100,1000(内部代替out 和 inout变量的对应形参的值重新赋值给外部变量)
总结:
当out类型和inout类型数据传入之后,实际上没有改变外部变量的值,
而是把值给了过程的形参,但是形参会将out的值清除为null
走到end代表过程结束,开始工作,并判断变量是否是out或者inout类型
如果是,将内部代替out 和 inout变量的对应形参的值重新赋值给外部变量,
也就是会将外部变量本身的值给覆盖掉
欢迎交流!