本篇主要介绍MySQL存储过程的相关内容
目录
一、什么是存储过程?
存储过程是存储在数据库的一组已经事先经过编译的SQL语句集合,客户端可以直接调用存储过程来减少与服务端进行IO的次数,从而减少网络IO的次数,从而提高性能。存储过程主要包含如下三个特点:
- 封装和复用:存储过程对一组SQL进行了封装,需要使用时直接进行调用
- 能够进行参数交互:存储过程可以接收参数,也可以传递返回值
- 减少网络IO:对于多组SQL语句的执行,只要只要进行一次网络IO就能完成
二、基本语法
下面我们来了解一下存储过程的基本语法。
创建存储过程
创建存储过程的语法如下:
create procedure 存储过程名称([参数列表])
begin
--sql语句
end;
在定义sql语句时,可能会需要用到';',这就可能导致存储过程还没创建好就提前结束了,因此我们需要通过 delimiter 来将结束符改为其它字符,定义完成存储过程之后,再改回原来的';'。
调用存储过程
调用存储过程的基本语法如下:
call 存储过程名称(参数列表)
查看存储过程
我们可以查看指定数据库的存储过程及其状态,语法如下:
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = '数据库名称';
我们还可以查看完整的存储过程,即存储过程的创建语句,具体语法如下:
show create procedure 存储过程名
删除存储过程
删除存储过程的语法如下:
drop procedure [if exits] 存储过程名
三、变量
在MySQL中,变量可以分为三种类型,系统变量,用户自定义变量和局部变量,下面让我们来具体了解一下。
系统变量
系统变量可以分为两种,一种是会话级的系统变量,一种是全局的系统变量。会话级的系统变量只是针对于当前会话生效,而全局系统变量则是对所有会话都生效,下面我们来看一下系统如何查看。查看系统变量有两种方式,一种是通过show,一种是通过select。
通过show我们可以查看当前系统全部的系统变量,具体语法如下:
show [session,global] variables;
其中session表示会话级系统变量,意为查看当前会话生效的系统变量,global则是查看所有会话生效的系统变量 。
我们还可以对变量进行模糊匹配:
show [session,global] variables like '需要模糊匹配变量名片段';
用select 可以查看指定系统变量的值,具体语法如下:
select @@[session| global] 系统变量名;
我们也可以对系统变量进行修改,修改系统变量的语法有两种,具体如下:
set @@[session | global] 系统变量名 = 值;
set [session | global] 系统变量名 = 值;
其中session表示当前修改只对当前会话生效,而global则对所有会话都生效。
(在前面的语句中,如果没有指定为session或global,则默认为session)
用户自定义变量
在MySQL中,我们可以根据自己的需求来自定义一些变量,创建自定义变量有如下两种方式:
方式一:通过set创建
set @变量名 = 值 [,@变量名 = 值,.....];
set @变量名 := 值 [,@变量名 = 值,.....];
方式二: 通过select创建
select @变量名 := 值 [,@变量名 = 值,.....];
select 字段名 into @var_name from 表名;
查看 自定义变量的语法如下:
select @变量名;
下面我们来尝试创建一个自定义变量test
可以发现创建成功了,我们再来查看一下:
可以发现test的值被成功查到了。
需要注意的是,我们自定义的变量,只在当前会话生效。
局部变量
局部变量是指定义在存储过程中的变量,它只在存储过程中生效,可以作为存储过程的接收参数,或者返回参数等。
创建局部变量的语法如下:
declare 变量名 变量类型 [default ... ] ;
其中,default为局部变量的默认值,局部变量需要设置类型,常见的类型有:
int 、 bigint、char 、varchar 、date 、time等。
我们可以通过set给局部变量进行赋值,具体如下:
set 变量名 = 值;
set 变量名 := 值;
四、存储过程的参数
前面我们说过存储过程是可以有参数的,下面我们来具体了解一下存储过程的参数。
存储过程的参数有三种类型,分别如下:
- in : 作为输入参数,用来接收外部传入到存储过程的值。
- out : 作为输出参数,函数过程执行完后将该参数的值返回给存储过程的调用者。
- inout:该类型的参数既作为输入参数又作为输出参数。
下面,让我们来具体演示一下这三种参数。
in
首先,我们创建存储过程p1,并为其设置一个in类型的int数据类型的sorce参数:
此时我们,我们调用一下这个存储过程,并传入一个数值:
可以发现调用成功了。
如果我们不传值,则会报错:
out
我们在创建一个存储过程p2,以int数据类型的ret作为out类型的参数,然后在存储过程的begin ->end中给out赋值(需要现修改结束符):
接下来,我们调用p2,需要往p2中传入一个变量来接收p2的返回值,具体如下:
然后我们再来查看一下@test的值
可以发现值正是p2返回的1。
inout
我们再创建存储过程p3,并设置一个inout类型参数num,然后让num翻10倍
然后我们调用p3,此时我们需要传入一个变量,num既会去接收这个变量的值作为传入参数,又会在函数过程结束后作为返回值返回给该变量 。接下来我们传入前面的test变量(值为10)
然后我们再来查看一下test的值 :
可以发现test的值已经翻了10倍了。