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倍了。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/678573.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

No module named _sqlite3解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

RedHat9 | 控制启动过程

1、Linux系统启动引导流程 加电自检(POST)寻找启动顺序(BIOS/UEFI)读取启动加载程序(MBR->Bootloader)加载内核与内存文件系统(kernel-initramfs)加载硬件及驱动(/lib/modules或/lib64/modules)初始化系…

9 -力扣高频 SQL 50 题(基础版)

9 - 上升的温度 -- 找出与之前(昨天的)日期相比温度更高的所有日期的 id -- DATEDIFF(2007-12-31,2007-12-30); # 1 -- DATEDIFF(2010-12-30,2010-12-31); # -1select w1.id from Weather w1, Weather w2 wheredatediff(w1.recordDate,w2.recordDat…

数组的详细介绍

数组是一组相同类型元素的集合,也就是说:数组至少包含两个及以上的元素,且元素类型相同。 数组包括一维数组和多维数组,其中二维数组最常见。下面我们一一介绍。 一维数组: 格式:type name [常量值]&…

微信短视频怎么收藏?成都鼎茂宏升文化传媒公司

微信短视频怎么收藏?一文教你轻松掌握 随着微信功能的不断升级,微信短视频已经成为我们日常生活中不可或缺的一部分。无论是朋友分享的生活点滴,还是公众号推送的精彩内容,短视频都以其直观、生动的形式,吸引着我们的…

Qt——控件

目录 概念 QWidget核心属性 enabled geometry WindowFrame的影响 windowTitle windowIcon qrc的使用 windowOpacity cursor font toolTip focusPolicy ​编辑 styleSheet 按钮类控件 PushButton RadioButton CheckBox 显示类控件 Label textFormat pixm…

什么牌子的洗地机好?高端旗舰洗地机,清洁力强的洗地机品牌

科技水平的不断进步,人们对生活环境的要求日益提高,洗地机作为一种高效,便捷的清洁设备,在家务清洁中,越来越受重视,洗地机不仅在吸尘、拖地和深度清洁等方面表现出色,可以帮助用户轻松应对各种…

Swagger教程:【Swagger】让你的API文档焕然一新!

Swagger(现称为OpenAPI Specification)是一种用于描述RESTful API接口的规范。它允许您以机器可读和人类可读的方式定义服务,使得开发、测试、维护和文档化API变得更加高效。下面整理了一个基础的Swagger教程,包括其重要组成部分和…

2021 hnust 湖科大 计组课设 包含multisim14连线文件,报告,指导书

2021 hnust 湖科大 计组课设 包含multisim14连线文件,报告,指导书 描述 hnust计组课设要用到的东西都在里面了 下载链接 https://pan.baidu.com/s/1tHooJmhkrwX47JCqsg379g?pwd1111

计网期末复习指南(五):运输层(可靠传输原理、TCP协议、UDP协议、端口)

前言:本系列文章旨在通过TCP/IP协议簇自下而上的梳理大致的知识点,从计算机网络体系结构出发到应用层,每一个协议层通过一篇文章进行总结,本系列正在持续更新中... 计网期末复习指南(一):计算机…

【计算机毕设】基于SpringBoot的民宿在线预定平台设计与实现 - 源码免费(私信领取)

免费领取源码 | 项目完整可运行 | v:chengn7890 诚招源码校园代理! 1. 研究目的 本研究旨在设计并实现一个基于SpringBoot的民宿在线预定平台。通过信息化手段提高民宿预定效率,方便用户查询房源、预定房间、在线支付和…

OBS+nginx+nginx-http-flv-module实现阿里云的推流和拉流

背景:需要将球机视频推送到阿里云nginx,使用网页和移动端进行播放,以前视频格式为RTMP,但是在网页上面播放RTMP格式需要安装flash插件,chrome浏览器不给安装,调研后发现可以使用nginx的模块nginx-http-flv-…

LlamaIndex介绍

LlamaIndex LangChain v0.2 教程分成以下部分: 1、入门 2、学习 3、用例 4、示例 5、高级 6、组件指南 RAG 用额外的信息来提高回答的质量。 分为 5个阶段: (1)loading 加载原始文件,LlamaHub 提供数百种连…

借助调试工具理解BLE协议_1.蓝牙简介和BLE工作流程

1.蓝牙简介 蓝牙是一种近距离无线通信技术,运行在2.4GHz免费频段,目前已大量应用于各种移动终端,物联网,健康医疗,智能家居等行业。蓝牙4.0以后的版本分为两种模式,单模蓝牙和双模蓝牙。 单模蓝牙&#xf…

聊聊测试的右移

这是鼎叔的第九十九篇原创文章。行业大牛和刚毕业的小白,都可以进来聊聊。 欢迎关注本公众号《敏捷测试转型》,星标收藏,大量原创思考文章陆续推出。本人新书《无测试组织-测试团队的敏捷转型》已出版(机械工业出版社&#xff09…

体育赛事直播系统开发源码搭建

随着体育产业的蓬勃发展,体育赛事直播已成为广大观众获取赛事信息的重要途径。为了满足观众日益增长的需求,开发一套专业的体育赛事直播系统成为当务之急。本文将围绕体育赛事直播系统开发源码搭建进行深入探讨,从技术选型、系统架构、安全防…

教你一绝招:如何快速提高学习成绩--这样学习,你离考取重点高中或名牌大学很近了

教你一绝招:如何快速提高学习成绩 这样学习,你离考取重点高中或名牌大学很近了 我本来是讲写作的,但回想起过去学习与考试情况,何不把自己的学习经验与绝技告诉如今苦学的孩子,让其尽快进步,早日实现自己的…

面试一个多月,我上岸了!

大家好,我是枫哥,🌟阿里云技术专家、📝资深面试官、🌹Java跳槽网课堂创始人。拥有多年一线研发经验,曾就职过科大讯飞、美团网、平安等公司。目前组建的团队,专注Java技术分享,一对一…

副业兼职不知道做什么,不如先试试这个,一天挣个百八十很简单

在市场上,总是不乏赚钱的机会和各式各样的挣钱项目。许多人往往认为,那些赚得盆满钵满的人纯粹是因为运气好、能力强、条件优越且智商高。然而,事实并非如此简单。 实际上,每一个项目或操作方法的背后,都有其独特的逻…

期刊的分类与级别

在学术界,期刊的分类与级别构成了一个评价学术成果和学者贡献的重要标准,同时也是学术出版与学术交流的基础。然而,对于初涉学者来说,理解期刊的分类与级别可能并不直观。本文旨在提供一个系统性的解释,并阐述为何期刊…