mysql存储过程的理解和应用

自身对存储过程概念的理解:

-- 存储过程

不同点:

-- 标识符不同:函数是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变量的对应形参的值重新赋值给外部变量,

也就是会将外部变量本身的值给覆盖掉


欢迎交流!

猜你喜欢

转载自blog.csdn.net/zhangzeshan/article/details/88388889