MySQL 存储过程(一)

发布于:2024-06-04 ⋅ 阅读:(55) ⋅ 点赞:(0)

本篇主要介绍MySQL存储过程的相关内容

目录

一、什么是存储过程?

二、基本语法 

创建存储过程

调用存储过程 

 查看存储过程

删除存储过程

三、变量

系统变量

用户自定义变量

局部变量

四、存储过程的参数

in

out

inout


一、什么是存储过程?

存储过程是存储在数据库的一组已经事先经过编译的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倍了。