MySQL | 存储过程

一、概念

存储过程简称过程,procedure,是一种用来处理数据(增删改)的方式。简单点,我们也可以将其理解为没有返回值的函数。

一般存储过程并不显示结果,而是把结果返回给你指定的变量

二、创建过程

基本语法

create procedure 过程名字([参数列表])
begin
    -- 过程体
end

如果过程体中只有一条指令,则可以省略 begin 和 end

创建一个完整的存储过程


三、查看过程

查看全部存储过程:show procedure status [like 'pattern'];

查看存储过程的创建语句:show create procedure 过程名字


四、调用过程
  • 语法:call 过程名([实参列表])

因为存储过程实际上是一种函数,所以存储过程名后需要有()符号,即使没有参数也需要()

五、删除过程

语法:drop procedure 过程名


六、存储过程的形参类型

函数的参数需要指定数据类型,过程比函数更加严格。过程有三种自己的参数类型

  • in:参数从外部传入到内部,可以是数据或者变量
  • out:参数从过程里面把数据保存到变量,然后交给外部使用,从外部传入的必须是变量。如果从外部传入的变量本身有值,需要先清空在传入内部
  • inout此参数只能传递变量,该变量的值可以给过程内部使用,过程结束后可以变量的值传递给过程外部使用
基本语法

procedure 过程名(in 参数名字 参数类型, out 参数名字 参数类型, inout 参数名字 参数类型)

我们先定义一个简单的过程

delimiter ##
create procedure pro(in var1 int, out var2 int, inout var3 int)
begin
   -- 查看该过程传入的三个变量
   select var1, var2, var3;
end
##

delimiter ;

-- 调用过程
call pro(1, 2, 3);

在调用该函数的时候出现错误,因为 in 和 out 类型只能接受变量,不能接受具体的数值

因此,我们先定义几个变量,然后再调用

可以看到,传递给 out 类型参数的 @var2 变量在经过过程处理之后,变为了 null,这是因为在 out 修饰的参数中,如果传入的变量有值,也会自动清空为 null。同时在过程内部对变量的值的改变会影响到外部

1.

先来看一个例子

set @no1 = 100;
set @no2 = 200;
set @no3 = 300;

delimiter ##
create procedure pro(in var1 int, out var2 int, inout var3 int)
begin
    -- 查看传入的三个变量的值
    select var1, var2, var3;
    
    -- 修改三个变量的值
    set var1 = 1;
    set var2 = 2;
    set var3 = 3;
    
    -- 修改后的三个变量的值
    select var1, var2, var3;
    
    -- 查看会话变量
    select @no1, @no2, @no3;

end
##

delimiter ;

-- 调用改方法
call pro(@no1, @no2, @no3);

如图所示,我们成功创建了该过程

然后我们调用该方法,参数就是之前定义的变量,结果如下。可以看到 in 类型参数在内部改变后,在外部查询还是改变之前的值,out 和 inout 类型参数在内部改变后,外部查询就是改变之后的值。

2.

我们在来看一个例子

set @no1 = 100;
set @no2 = 200;
set @no3 = 300;

delimiter ##
create procedure pro2(in var1 int, out var2 int, inout var3 int)
begin
    -- 查看三个传入进来的数据的值
    select var1, var2, var3;
    
    -- 修改三个变量的值
    set var1 = 1;
    set var2 = 2;
    set var3 = 3;
    
    -- 查看修改后的三个变量的值
    select var1, var2, var3;
    
    -- 查看会话变量
    select @no1, @no2, @no3;
    
    -- 修改会话变量
    set @no1 = 'a';
    set @no2 = 'b';
    set @no3 = 'c';
    
    -- 查看修改会话变量之后的值
    select @no1, @no2, @no3;

end;
##
delimiter ;

-- 调用过程
call pro2(@no1, @no2, @no3);

我们不仅在内部对传入的参数作了修改,还直接对会话变量作了修改。对应 in 类型参数,只有直接对会话变量进行修改,外部才真查询到修改;out 和 inout 参数若已经通过传入的参数进行修改了,外部查询到的就是对参数修改后的值,就算在内部使用会话变量修改也没有用

总结
  • in 类型修饰的变量类似于“值传递”,即传入的只是变量的拷贝,就算在过程里面修改了,那也只是对拷贝的变量进行修改,原来的变量的值依然没有修改
  • out 和 inout 类型修饰的变量也同样是 “值传递”,和 in 不同是的,他们是通过引用来传递的,即先拷贝一个引用,指向传入的变量,对变量进行修改。此时变量的修改就会覆盖原来的值

七、过程和函数
相同点
  • 存储过程和函数都是为了可重复执行操作数据库的 sql 语句的集合
  • 存储过程和函数都是一次编译,后续执行
不同点
  • 标识符不同,函数是 function,过程是 procedure
  • 函数中有返回值,过程没有返回值
  • 函数中不能使用 select 语句,而过程可以使用
  • 函数最后可以通过 select 语句使用,过程通过 call 语句使用
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值