MySQL 存储过程(一)

news2024/11/28 4:50:00

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【React】classnames 优化类名控制

1. 介绍 classnames是一个简单的JS库,可以非常方便的通过条件动态的控制class类名的显示 ClassNames是一个用于有条件处理classname字符串连接的库 简单来说就是动态地去操作类名,把符合条件的类名粘在一起 现在的问题:字符串的拼接方式不…

uc/OS-III多任务程序

文章目录 一、实验内容二、实验步骤(一)基于STM32CubeMX建立工程(二)获取uc/OS-III源码(三)代码移植 三、修改mai.c文件四、实验现象 一、实验内容 学习嵌入式实时操作系统(RTOS),以…

【python】python商业客户流失数据模型训练分析可视化(源码+数据集+课程论文)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

btstack协议栈实战篇--GAP Link Key Management

btstack协议栈---总目录-CSDN博客 目录 1.GAP 链接密钥逻辑 2.蓝牙逻辑 3.主应用程序设置 4.log信息 展示了如何遍历存储在 NVS 中的经典链接密钥,链接密钥是每个设备-设备绑定的。如果蓝牙控制器可以交换,例如在桌面系统上,则每个控制器都需…

Vue2入门(安装Vue、devtools,创建Vue)以及MVVM分层思想

文章目录 1.下载并安装Vue2.使用Vue2.1 创建Vue以及挂载Vue2.2 模板语句的数据来源:data2.3 template配置项详解2.4 Vue实例和容器的关系 3.安装devtools4.MVVM分层思想 1.下载并安装Vue (1)Vue是一个基于JavaScript(JS&#xff…

数仓开发:如何计算投放效果?

背景介绍 业务介绍:用户是通过低价引流进来,然后通过复购购买高价商品,可以多次购买。低价商品和高价商品均可以退款,高价商品由于各种复杂的场景,可能会有多次退款。低价商品如果退款是全退,不存在多次退…

手猫助手Agent技术探索总结

随着LLM的发展,ChatGPT能力不断增强,AI不断有新的概念提出,一种衍生类型的应用AI Agent也借着这股春风开启了一波话题热度,各种初创公司,包括Open AI内部也都在密切关注着AI Agent领域的变化。阿里集团内的AI团队也有很…

容器运行nslookup提示bash: nslookup: command not found【笔记】

在容器中提示bash: nslookup: command not found,表示容器中没有安装nslookup命令。 可以通过以下命令安装nslookup: 对于基于Debian/Ubuntu的容器,使用以下命令: apt-get update apt-get install -y dnsutils对于基于CentOS/R…

【Vue】如何提供访问vuex的数据

文章目录 一、提供数据二、访问Vuex中的数据通过$store访问的语法1)模板中使用2)组件逻辑中使用3)js文件中使用 三、通过辅助函数 - mapState获取 state中的数据 一、提供数据 State提供唯一的公共数据源,所有共享的数据都要统一…

6.7 输入输出流

输入:将数据放到程序(内存)中 输出:将数据从程序(内存)放到设备中 C的输入输出分为3种形式: 从键盘屏幕中输入输出,称为标准IO 对于磁盘进行标准输入输出,称为文件IO…

安装ps提示vcruntime140.dll丢失的解决方法,总结5种解决方法

在电脑使用过程中,我们经常会遇到一些错误提示,其中之一就是“找不到vcruntime140.dll”。这个问题可能会导致程序无法正常启动或运行,因此了解其原因和解决方法是非常必要的。小编将从多个方面对“找不到vcruntime140.dll”这一问题进行详细…

端午与高考的交汇点:家的温暖与梦想的起点

当端午节的粽香弥漫在街头巷尾,高考的脚步也悄然而至。这两个看似毫无关联的时刻,却在每年的六月,奇妙地交汇在一起,为我们带来了一段特别的记忆。这不仅是家的温暖与梦想的起点相遇的时刻,更是传统文化与现代追求共融…

用户输入表格数据设计(XPTable控件使用说明九)

XP Table控件可以编辑数据,程序也可以使用编辑后的数据,但是程序新建时又从初始化数据到模型到显示,这两步有点绕,做了一个实例来说明这块内容。 流程1:初始化数据--> model--> UI show 流程2:UI--…

【面试官】知道synchronized锁升级吗

一座绵延在水上的美术馆——白鹭湾巧克力美术馆。它漂浮于绿水之上,宛如一条丝带轻盈地伸向远方 文章目录 可重入锁synchronized实现原理 synchronized缺点保存线程状态锁升级锁升级优缺点 1. 可重入锁 面试官:知道可重入锁有哪些吗? 可重入意味着获取…

【Git】之 【Bug】clone 克隆失败 过早的文件结束符

问题 解决 参考:git clone报错 过早结束问题解决方法 git config --global http.lowSpeedLimit 0 git config --global http.lowSpeedTime 999999 git config --global http.postBuffer 10024288000 git config --list

wireshark 标记自己想要的数据包

1:点击视图 2:点击视图-着色规则 点击新增一行,双击名称-进行编辑 过滤器规则-编辑自己想要看到的 点击前景-选择凸出显示颜色 点击背景--选择凸出显示颜色 点击确定按钮

LDR6020一拖二快充线:高效充电的新选择

LDR6020一拖二快充线:高效充电的新选择 随着移动设备的普及和功能的日益增强,电池续航成为了用户关注的重点之一。为了满足用户对于快速充电的需求,各大厂商纷纷推出了各种快充技术和产品。在这个背景下,LDR6020一拖二快充线凭借…

PowerDesigner导入Excel模板生成数据表

PowerDesigner导入Excel模板生成数据表 1.准备好需要导入的Excel表结构数据,模板内容如下图所示 2.打开PowerDesigner,新建一个physical data model文件,填入文件名称,选择数据库类型 3.点击Tools|Execute Commands|Edit/Run Script菜单或按下快捷键Ctrl Shift X打开脚本窗口…

台湾合泰原装BS66F360 封装LQFP-44 电容触摸按键 AD+LED增强型触控

BS66F360是一款由Holtek Semiconductor Inc.生产的微控制器(microcontroller),具有触摸检测和LED驱动功能。其应用领域广泛,包括但不限于以下几个方面: 1. 触摸按键应用:BS66F360内置了触摸按键检测功能&am…

记一个ESP12-F芯片的坑

这两个都叫ESP-12F从外观上很难区分他们的差别,甚至背面的引脚都是一样的 这个单独的芯片就是从板子上拆下来的,使用这颗芯片按住FLASH按键LED灯会亮,很离谱,led灯的引脚是GPIO2 flash引脚是GPIO0,他们之间的内部封装…