MySQL 存储过程(一)

本篇主要介绍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倍了。

相关推荐
数据龙傲天14 分钟前
1688商品API接口:电商数据自动化的新引擎
java·大数据·sql·mysql
engineer-gxd1 小时前
MySQL 表的操作
mysql
cyt涛1 小时前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok
Rookie也要加油1 小时前
01_SQLite
数据库·sqlite
liuxin334455662 小时前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
看山还是山,看水还是。2 小时前
MySQL 管理
数据库·笔记·mysql·adb
fishmemory7sec2 小时前
Koa2项目实战2(路由管理、项目结构优化)
数据库·mongodb·koa
momo小菜pa3 小时前
【MySQL 09】表的内外连接
数据库·mysql
Jasonakeke3 小时前
【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化
数据库·mysql
程序猿小D3 小时前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa