史上最简单的 MySQL 教程(四十四)「存储过程」

温馨提示:本系列博文已经同步到 GitHub,地址为「mysql-tutorial」,欢迎感兴趣的童鞋StarFork,纠错。

存储过程

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

创建过程

-- 基本语法
create procedure 过程名([参数列表])
begin
	-- 过程体
end

如果我们定义的过程的过程体内仅含有一条语句,则可以省略beginend。执行如下语句,进行测试:

-- 创建过程
create procedure pro()
select * from student;
16

如上图所示,我们创建了一个名为pro()的过程,其目的就是为了查询student表中的数据。但实际上,过程多用于处理数据,查询并不多用。

查看过程

查看过程,基本语法为:

  • show procedure status + [like 'pattern'];
17

查看过程的创建语句,基本语法为:

  • show create procedure + 过程名;
18

调用过程

由于函数有返回值,因此我们可以用select来调用函数。但是存储过程没有返回值,怎么办?实际上,对于存储过程,有一个专门的调用关键字call,调用过程的基本语法为:

  • call + 过程名;
19

修改过程 & 删除过程

过程只能先删除后新增,不能修改。删除过程的基本语法为:

  • drop procedure + 过程名;

执行如下语句,进行测试:

-- 删除过程
drop procedure pro;
-- 查看过程
show procedure status like 'pro'\G;
20

过程参数

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

  • in,数据只是从过程外部传入给过程内部使用,可以是数值也可以是变量;
  • out,此参数只能传递变量,且变量指向的数据需要先清空然后才能进入过程内部,该引用供过程内部使用,过程结束后可以将变量的值传递给过程外部使用;
  • inout,此参数只能传递变量,该变量的值可以给过程内部使用,过程结束后可以变量的值传递给过程外部使用。

因此,过程定义的具体形式应该为:

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

下面,我们定义一个简单的过程,并调用过程。代码如下:

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

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

如上图所示,过程pro2创建成功。但是,在调用过程的时候出现错误,造成该错误的原因为:过程的outinout两个参数只能接受变量,而我们传递了具体的数值,报错也就在情理之中啦!接下来,执行如下语句,进行测试:

-- 设置全局变量
set @var1 = 1;
set @var2 = 2;
set @var3 = 3;

-- 调用过程
call pro2(@var1, @var2, @var3);
-- 查看变量
select @var1, @var2, @var3;
22

如上图所示,在我们将变量传递给过程的时候,过程正常执行。此外,通过select语句我们可以看到传递给out类型参数的@var2的值在经过过程处理之后,被置为null值啦,这也是符合out类型参数的先清空后使用原则的。而且,由于outinout只能接受变量作为参数,因此在过程内部对outinout传入的变量的修改会影响到过程外部。在这里,值得我们注意是:存储过程对变量的操作是滞后的,即只有在过程结束的时候,才会将过程内部修改的值赋值给外部传入的对应的全局变量。执行如下语句,进行测试:

delimiter $$
create procedure pro3(in var1 int, out var2 int, inout var3 int)
begin
	-- 查看该过程传入的三个变量
	select var1, var2, var3;
	-- 修改局部变量
	set var1 = 10;
	set var2 = 20;
	set var3 = 30;
	-- 查看局部变量
	select var1, var2, var3;
	-- 查看全局变量
	select @var1, @var2, @var3;	
	-- 修改全局变量
	set @var1 = 'a';
	set @var2 = 'b';
	set @var3 = 'c';
	-- 查看全局变量
	select @var1, @var2, @var3;		
end
$$
delimiter ;
23
-- 调用过程
call pro3(@var1, @var2, @var3);
-- 在过程结束后,查看全局变量
select @var1, @var2, @var3;
24

如上图所示,存储过程执行成功,且验证了我们结论,即:在存储过程没有结束的时候,对传入变量的修改并不会影响到对应的全局变量;只有在存储过程结束后,才会将对应的变量值赋值给outinout类型的变量,而in类型的变量不受影响


温馨提示:符号[]括起来的内容,表示可选项;符号+,则表示连接的意思。


———— ☆☆☆ —— 返回 -> 史上最简单的 MySQL 教程 <- 目录 —— ☆☆☆ ————

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 zhuanlan_guanli@qq.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GreenLeaves

C#核编之系统数据类型和相应的C#关键字

和任何编程语言一样,C#定义了一组用于表示局部变量、成员变量、返回值以及输入参数的基本数据类型。然而,与其他编程语言不同的是,这些关键字不只是编译器能识别的标记...

1788
来自专栏无所事事者爱嘲笑

function前加运算符实现立即执行函数

872
来自专栏快乐八哥

JavaScript中的函数基础

函数能让开发者把JavaScript代码变得更有效率,而且更能重复吃用。函数解决思路:把大问题变成小问题,分割的思路。 函数的语法: 函数类型1: functi...

1866
来自专栏淡定的博客

python入门基础语法总结

613
来自专栏代码世界

Python之内置函数

内置函数 python里的内置函数。截止到python版本3.6.2,现在python一共为我们提供了68个内置函数。它们就是python提供给你直接可以拿来使...

2887
来自专栏指尖下的Android

JNI之路径初探---6

本篇文章讲解JNI下属性的内存释放问题,众所周知,JAVA有四大引用,1,强引用2,弱引用3,软引用4,虚引用。JNI有三大引用,1,普通全局引用2,弱全局引用...

602
来自专栏十月梦想

php内建函数

strpos(变量名,'包含字符')判断变量中字符首次出现的位置,返回值数字,第一位为0

1034
来自专栏积累沉淀

linux shell函数定义和调用

说起函数调用,相信大家也不会陌生,然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很“自...

1917
来自专栏个人随笔

房上的猫:while循环与do-while循环,debug的调试运用

一.循环结构  1.循环不是无休止进行的,满足一定条件的时候循环才会继续,称为"循环条件",循环条件不满足的时候,循环退出  2.循环结构是反复进行相同的或类似...

35311
来自专栏散尽浮华

python基础随笔

一: 作用域 对于变量的作用域,只要内存中存在,该变量就可以使用。 二:三元运算 name = 值1 if 条件 else 值2 如果条件为真:result =...

1859

扫描关注云+社区