重学MySQL之存储过程函数&存储函数

297 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

前言

工作也有段时间了,工作中使用MySQL数据库极多,但是愈发感觉自己对MySQL的使用和理解还停留在很基础的层面,使用打算利用两个月重学学习一下MySQL,对于已经了解的进行巩固,进一步加深理解,对于没接触过的更加要上心,工作之后才更加明白学习的目的是为了什么!更加清除学习的方向是什么!

正文

创建两张表:class & student (ps:这里大家可以根据自己的情况创建,因为没有业务的支持,凭空创建的表都没有业务依据,只是为了初步掌握语法)

image.png

image.png

很简单的表关系,学生表里有一个班级id,每个学生只能属于一个班级

查看一下当前数据库版本,我是基于MySQL5.7版本的例子 select version();

image.png

存储过程

创建一个最简单的存储过程,查询全部的class数据

image.png

调用存储过程:call select_all_class_data();,查看结果

image.png 总共是10w条数据,没错,上面的是无参数的存储过程,下面来有参的存储过程

image.png

调用存储过程:call select_min_id_claasss_name(@class_id);

查询自定义变量:select @class_id; (ps: 自定义变量 set @xxx = xxx值)可以看到最小的id为1,并且输出

image.png

下面是存储过程输入参数:根据输入 id 显示class 信息 , in 输入

image.png

可以看到调用结果没有问题

image.png

有输入有输出的存储过程:根据输入class_id 输出 class_name

image.png 细心的朋友会发现,怎么多了对标签delimiter,这是因为在命令行情况下,MySQL分隔符默认是; 无法直接create procedure 创建存储过程,delimiter的作用就是将分隔符临时变成//,最后在变回;

自定义变量 @class_id 初始值等于1,定义了@class_name;用于输出结果

image.png

调用结果如下:

image.png

最后还有一种既是输入又是输出的变量inout,但是我个人认为,inout不便于理解使用,很容易混淆入参和出参,还是使用inout比较明确

image.png

根据className输出对应的班级地址,调用输出如下:

image.png

存储函数

image.png

如果此时我们直接去调用存储函数,因为这是我们自定义的函数,mysql是默认不信任的,会抛出带有log_bin_trust_function_creators的异常。

所以我们需要设置一下MySQL:set global log_bin_trust_function_creators = 1; 再执行 image.png

总结

存储过程之后其实存储函数也不难理解,因为他们两个语法大差不差,只不过存储函数必须要有返回值而存储过程则只能通过变量的方式变相的达到返回值,到这里我们不妨想一想存储过程和存储函数的应用场景是什么?

优点: 针对某些固定的逻辑,我们可以抽取出来方便后续使用

缺点: 存储过程不支持事务、不方便移植,如果是MySQL移植到Oracle 那么需要修改语法、难以debug。

说实话其实就我目前的工作用到存储过程和存储函数的情况和次数都不多,但是为什么我还有去了解一下他们的语法呢?说到底还是害怕真正在工作时遇到这种情况,刚好需要但是确因为自己没有接触过而感到有点心虚,我不知道大家有没有这种感觉,就是对没了解过的技术,突然需要使用时会不自觉的逃避,所以为了工作时安稳一点我还是决定花一晚上的时间了解下。