Mysql存储过程(附案例)


文章目录

  • 存储过程概述
  • 1、基本语法
  • 2、变量
    • ①、系统变量
    • ②、用户自定义变量
    • ③、局部变量
  • 3、流程控制语句
    • ①、if语句
    • ②、参数
    • ③、case语句
    • ④、while语句
    • ⑤、repeat语句
    • ⑥、loop语句
    • ⑦、cursor游标
    • ⑧、handler
  • 4、存储函数

存储过程概述

存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,提高数据处理的效率

存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。

优点:

  1. 减少网络传输:在数据库端执行,降低应用服务器与数据库间的数据交互

  2. 性能提升:预编译减少了重复解析和优化,提高执行效率

  3. 简化开发:封装复杂逻辑,减少应用层代码量,便于调用

1、基本语法

  • 创建:
CREATE PROCEDURE 存储过程名称 ([参数列表]) BEGIN -- SQL语句 END;

举例:

-- 创建
CREATE PROCEDURE p1()
BEGINSELECT COUNT(*) FROM student;END

运行结果:
可以看到在functions下多了一个p1函数
在这里插入图片描述

  • 调用:
CALL 存储名称 ([参数]);

​举例:

CALL p1();

运行结果:
在这里插入图片描述

  • 查看
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'xxx'; -- 查询指定数据库的存储过程及状态信息
SHOW CREATE PROCEDURE 存储过程名称; -- 查询某个存储过程的定义

举例:

-- 查询指定数据库的存储过程及状态信息
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'school_db';-- 查询某个存储过程的定义
SHOW CREATE PROCEDURE p1;

运行结果:

分别是两条语句的运行结果:
在这里插入图片描述
在这里插入图片描述

  • 删除
DROP PROCEDURE [IF EXISTS] 存储过程名称;

举例:
这样就删除成功了:

DROP PROCEDURE p1;

2、变量

①、系统变量

系统变量由Mysql服务器提供,不由用户定义,属于服务器层面,分为全局变量与会话变量。

全局变量:无论开多少个会话,变量值都是一样的,
会话变量:只在当前会话生效的变量。

在这里插入图片描述

像在navicat中,我们点击创建这三个query,就是三个不同的会话

查看语句:

-- 查看会话变量
SHOW SESSION VARIABLES;
-- 查看全局变量
SHOW GLOBAL VARIABLES;-- 模糊查询
SHOW SESSION VARIABLES like 'auto%';
SHOW GLOBAL VARIABLES like 'auto%';-- 直接选择具体的变量
SELECT @@global.autocommit;

查询结果:

在这里插入图片描述
变量可以看到有很多。

模糊查询结果:
在这里插入图片描述
具体查询结果:
在这里插入图片描述
更改语句:

-- 设置会话变量
SET SESSION autocommit = 0;
-- 设置全局变量
SET GLOBAL autocommit = 0;

②、用户自定义变量

用户定义变量是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用“@变量名”使用就可以。其作用域为当前连接。

使用方式:

-- 设置变量SET @user_name := 'zhangsan';select COUNT(*) into @num from student;-- 使用变量SELECT @num, @user_name;

注意点:赋值时使用 := 来赋值,然后赋值的话,也可以将查询的结果赋值给一个变量,如第二条查询语句。最后如果要查看自定义变量则使用最后一条的语法查询,查询结果如下:
在这里插入图片描述

③、局部变量

局部变量是根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。可用作存储过程中的局部变量和输入参数,局部变量的范围是在其声明的BEGIN … END块

使用方式:

CREATE PROCEDURE p2()
BEGIN-- 局部变量定义,前面为变量名,后面为变量类型,如int、varchar等。DECLARE stu_count int;-- 对变量赋值select COUNT(*) INTO stu_count from student;-- 查询变量select stu_count;
END-- 调用存储过程
CALL p2();

调用结果:
在这里插入图片描述

3、流程控制语句

这部分其实和编程语言的流程控制基本相同,分支、循环,传参等,我们直接实战来演示。

①、if语句

根据分数判断是否合格。

-- if
CREATE PROCEDURE p3()
BEGINDECLARE score INT DEFAULT 58;DECLARE result VARCHAR(10);-- if语句使用IF score >= 85 THENSET result = '优秀';ELSEIF score >= 60 THENSET result = '合格';ELSESET result = '不合格';end IF;-- 查询结果SELECT result;
END
-- 调用流程
CALL p3();

运行结果:
在这里插入图片描述

②、参数

只需要知道三个声名参数的方法,分别是in、out、inout。

in用来声名输入参数,out用来声名输出参数,输出参数一般由一个变量来接收。

-- 参数
-- in表示声名输入参数,out表示声名返回结果
CREATE PROCEDURE p4(in score INT, out result VARCHAR(10))
BEGIN-- if语句使用IF score >= 85 THENSET result = '优秀';ELSEIF score >= 60 THENSET result = '合格';ELSESET result = '不合格';end IF;
END
-- 调用过程
CALL p4(58, @result);SELECT @result;

查询结果:
在这里插入图片描述

inout表明输入和输出都是同一个变量。

-- 将数字换成百分制的。
CREATE PROCEDURE p5(inout score DOUBLE)
BEGINset score := score * 0.01
END;set @SCORE = 78
-- 调用过程
CALL p5(@SCORE);SELECT @SCORE;

运行结果:
在这里插入图片描述

③、case语句

根据月份判断第几季度。

-- case语句
CREATE PROCEDURE p6(in month INT)
BEGINdeclare result VARCHAR(10);casewhen month >= 1 and month <= 3 thenset result := '第一季度';when month >= 4 and month <= 6 thenset result := '第二季度';when month >= 7 and month <= 9 thenset result := '第三季度';when month >= 10 and month <= 12 thenset result := '第四季度';else set result := '非法参数';end case;select result;
END;CALL p6(7);

运行结果:
在这里插入图片描述

④、while语句

求n到1的累加值。

CREATE PROCEDURE p7(in n INT)
BEGINdeclare total INT DEFAULT 0;while n>0 doset total := total + n;set n := n - 1;end while;select total;
END;CALL p7(10);

运行结果:
在这里插入图片描述

⑤、repeat语句

repeat是有条件的循环退出语句,类似c语言的do while语句

CREATE PROCEDURE p8(in n INT)
BEGINdeclare total INT DEFAULT 0;repeatset total := total + n;set n := n - 1;until n <= 0end repeat;select total;
END;CALL p8(10);

运行结果:
在这里插入图片描述

⑥、loop语句

里面注意需要给loop代码命个名,退出循环需要指定loop的名称。 leave等同于c语言中的break, iterate 效果等同于c语言中的continue

需求:从n 到 1中所有偶数相加的和

CREATE PROCEDURE p9(in n INT)
BEGINdeclare total INT DEFAULT 0;sum:loopif n<=0 thenleave sum;end if;if n%2=1 thenset n := n - 1;iterate sum;end if;set total := total + n;set n := n - 1;end loop sum;select total;
END;CALL p9(10);

运行结果:
在这里插入图片描述

⑦、cursor游标

游标 (CURSOR) 是用来存储查询结果集的游标类型,在存储过程和函数中可以使用游标来循环处理查询结果集中的每行记录。

游标可以存储sql查询的结果集合,而之前的参数只能传单行单列的数据。

声明游标:

DECLARE 游标名称 CURSOR FOR 查询语句;

打开游标:

OPEN 游标名称;

获取游标记录:

FETCH 游标名称 INTO 变量[变量];

关闭游标:

CLOSE 游标名称;

需求:将查询到的数据,存储到新表tb_user_pro中,游标语法如下:

CREATE PROCEDURE p10(in uid INT)
BEGIN-- 定义游标与变量declare u_name varchar(50);declare u_gender varchar(50);declare u_cursor cursor for select stu_name,gender from student where stu_id <= uid;-- 创建测试表create table if not exists tb_user_pro(id int PRIMARY key auto_increment,name2 VARCHAR(50),gender VARCHAR(50));-- 开启游标open u_cursor; WHile true dofetch u_cursor into u_name, u_gender; -- 获取游标中的数据并赋值给变量insert into tb_user_pro(name2, gender) VALUES (u_name, u_gender); -- 执行插入语句end while;-- 关闭游标close u_cursor;
END;CALL p10(3);

运行结果:
在这里插入图片描述

可以看到,我们成功完成了功能,但是在执行的时候,有一些问题,在while true的时候,我们没有设置跳出循环的逻辑,导致结果正确,但执行会报错:
在这里插入图片描述

⑧、handler

条件处理程序 (Handler) 可以用来定义在流程控制结构过程中遇到问题时相应的处理步骤。具体语法为:

DECLARE handler_action HANDLER FOR condition_value [condition_value]... statement;handler_action
CONTINUE: 继续执行当前程序
EXIT: 终止执行当前程序condition_value
SQLSTATE sqlstate_value: 状态码,如 02000
SQLWARNING: 所有以01开头的SQLSTATE代码的警告
NOT FOUND: 所有以02开头的SQLSTATE代码的警告SQLEXCEPTION: 所有没有被SQLWARNING 或 NOT FOUND捕获的SQLSTATE代码的警告

这里我们直接基于上一个案例来解释语法怎么用

我们在上一个案例的PROCEDURE中定义一个条件处理程序,在报错时就会执行这个程序:

-- exit表示退出程序,
-- SQLSTATE '02000' 等价于 not found 
-- 该程序最后执行的语句为:close u_cursor
declare exit handler for SQLSTATE '02000' close u_cursor;

最后运行的时候,发现程序就不再报错了,功能也正常了。

4、存储函数

存储函数是否有可能返回值的存储过程,存储函数的参数只能是IN类型的。具体语法如下:

CREATE FUNCTION 存储函数名称( [参数列表] )
RETURNS type [characteristic …]
BEGIN-- SQL语句RETURN;
END;characteristic说明:DETERMINISTIC: 相同的输入参数总是产生相同的结果
NO SQL: 不包含SQL语句。
READS SQL DATA: 包含读取数据的语句,但不包含写入数据的语句。

举例说明,
功能:实现从n到1的累加:

create function fun1(n INT)
-- 必须指定返回类型 和 characteristic
returns int DETERMINISTICBEGINdeclare total INT default 0;while n > 0 doset total := total + n;set n := n - 1;end while;return total;
END;select fun1(100)

运行结果:
在这里插入图片描述

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

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

相关文章

小波变换+注意力机制成为nature收割机

小波变换作为一种新兴的信号分析工具&#xff0c;能够高效地提取信号的局部特征&#xff0c;为复杂数据的处理提供了有力支持。然而&#xff0c;它在捕捉数据中最为关键的部分时仍存在局限性。为了弥补这一不足&#xff0c;我们引入了注意力机制&#xff0c;借助其能够强化关注…

SQLMesh 增量模型从入门到精通:5步实现高效数据处理

本文深入解析 SQLMesh 中的增量时间范围模型&#xff0c;介绍其核心原理、配置方法及高级特性。通过实际案例说明如何利用该模型提升数据加载效率&#xff0c;降低计算资源消耗&#xff0c;并提供配置示例与最佳实践建议&#xff0c;帮助读者在实际项目中有效应用这一强大功能。…

Android应用内存分析与优化 - 工具篇之Booster

序 在原理篇中&#xff0c;我们发现在App内存的分布中&#xff0c;Code是占大头的部分&#xff0c;所以我们可以从App体积方面想办法&#xff0c;通过减小App体积达到降低内存的目的&#xff0c;同时&#xff0c;根据权威的机构分析&#xff0c;体积与用户下载和留存有很大的联…

金属加工液展|切削液展|2025上海金属加工液展览会

2025上海金属加工液展览会 时间&#xff1a;2025年12月2-4日 地点&#xff1a;上海新国际博览中心 2025上海金属加工液展规划30000平方米展览规模&#xff0c;预设展位1200个&#xff0c;将为国内外加工液产业提供一个集“展示、合作、交易、发展”于一体的综合性平台&#…

React学习———Redux 、 React Redux和react-persist

Redux Redux是一个流行的JavaScript状态管理库&#xff0c;通常用于React等前端框架结合使用。Redux 的设计思想是让应用的状态变得可预测、可追踪、易于调试和测试。 Redux的核心l理念 单一数据源&#xff1a;整个应用的状态被存储在一个唯一的Store对象中&#xff0c;所有…

Python字符串常用方法详解

文章目录 Python字符串常用方法详解一、字符串大小写转换方法(常用)1. 基础大小写转换2. 案例&#xff1a;验证码检查&#xff08;不区分大小写&#xff09; 二、字符串查找与替换方法1. 查找相关方法2. 替换相关方法 三、字符串判断方法1. 内容判断方法 四、字符串分割与连接方…

MyBatis—动态 SQL

MyBatis—动态 SQL 一、动态 SQL 的核心作用 动态 SQL 主要解决以下问题&#xff1a; 灵活性&#xff1a;根据不同的输入参数生成不同的 SQL 语句&#xff08;如条件查询、批量操作&#xff09;。 可维护性&#xff1a;减少重复代码&#xff0c;通过标签化逻辑提高 SQL 可读…

Python机器学习笔记(二十五、算法链与管道)

对于许多机器学习算法,特定数据表示非常重要。首先对数据进行缩放,然后手动合并特征,再利用无监督机器学习来学习特征。因此,大多数机器学习应用不仅需要应用单个算法,而且还需要将许多不同的处理步骤和机器学习模型链接在一起。Pipeline类可以用来简化构建变换和模型链的…

YOLOv3深度解析:多尺度特征融合与实时检测的里程碑

一、YOLOv3的诞生&#xff1a;继承与突破的起点 YOLOv3作为YOLO系列的第三代算法&#xff0c;于2018年由Joseph Redmon等人提出。它在YOLOv2的基础上&#xff0c;针对小目标检测精度低、多类别标签预测受限等问题进行了系统性改进。通过引入多尺度特征图检测、残差网络架构和独…

已解决(亲测有效!):安装部署Docker Deskpot之后启动出现Docker Engine Stopped!

文章目录 已解决&#xff1a;安装部署Docker Deskpot之后启动出现Docker Engine Stopped&#xff01;个人环境介绍自己的解决问题思路&#xff08;详细过程附截图&#xff09;1.打开控制面板2.点击程序和功能3.点击启动或关闭windows功能4.Hyper-V5.右键菜单栏的windows图标点击…

PCIE接收端检测机制分析

PCIE接收端检测机制分析 1、PCIE的接收端检测机制 接收器检测电路作为发射器的一部分实现&#xff0c;必须正确检测是否存在与ZRX-DC参数&#xff08;40Ω-60Ω&#xff09;隐含的直流阻抗等效的负载阻抗。 接收器检测序列的推荐行为如下&#xff1a; ‌初始状态‌&#xff…

[模型部署] 3. 性能优化

&#x1f44b; 你好&#xff01;这里有实用干货与深度分享✨✨ 若有帮助&#xff0c;欢迎&#xff1a;​ &#x1f44d; 点赞 | ⭐ 收藏 | &#x1f4ac; 评论 | ➕ 关注 &#xff0c;解锁更多精彩&#xff01;​ &#x1f4c1; 收藏专栏即可第一时间获取最新推送&#x1f514;…

InternVL3: 利用AI处理文本、图像、视频、OCR和数据分析

InternVL3推动了视觉-语言理解、推理和感知的边界。 在其前身InternVL 2.5的基础上,这个新版本引入了工具使用、GUI代理操作、3D视觉和工业图像分析方面的突破性能力。 让我们来分析一下是什么让InternVL3成为游戏规则的改变者 — 以及今天你如何开始尝试使用它。 InternVL…

鸿蒙 ArkUI - ArkTS 组件 官方 UI组件 合集

ArkUI 组件速查表 鸿蒙应用开发页面上需要实现的 UI 功能组件如果在这 100 多个组件里都找不到&#xff0c;那就需要组合造轮子了 使用技巧&#xff1a;先判断需要实现的组件大方向&#xff0c;比如“选择”、“文本”、“信息”等&#xff0c;或者是某种形状比如“块”、“图…

HTTP GET报文解读

考虑当浏览器发送一个HTTP GET报文时&#xff0c;通过Wireshark 俘获到下列ASCII字符串&#xff1a; GET /cs453/index.html HTTP/1.1 Host: gaia.cs.umass.edu User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax) Acc…

【Linux网络】数据链路层

数据链路层 用于两个设备&#xff08;同一种数据链路节点&#xff09;之间进行传递。 认识以太网 “以太网” 不是一种具体的网络&#xff0c;而是一种技术标准&#xff1b;既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内容。例如&#xff1a;规定了网络拓扑结…

【打破信息差】萌新认识与入门算法竞赛

阅前须知 XCPC萌新互助进步群2️⃣&#xff1a;174495261 博客主页&#xff1a;resot (关注resot谢谢喵) 针对具体问题&#xff0c;应当进行具体分析&#xff1b;并无放之四海而皆准的方法可适用于所有人。本人尊重并支持每位学习者对最佳学习路径的自主选择。本篇所列训练方…

logrotate按文件大小进行日志切割

✅ 编写logrotate文件&#xff0c;进行自定义切割方式 adminip-127-0-0-1:/data/test$ cat /etc/logrotate.d/test /data/test/test.log {size 1024M #文件达到1G就切割rotate 100 #保留100个文件compressdelaycompressmissingoknotifemptycopytruncate #这个情况服务不用…

2025认证杯二阶段C题完整论文讲解+多模型对比

基于延迟估计与多模型预测的化工生产过程不合格事件预警方法研究 摘要 化工生产过程中&#xff0c;污染物浓度如SO₂和H₂S对生产过程的控制至关重要。本文旨在通过数据分析与模型预测&#xff0c;提出一种基于延迟估计与特征提取的多模型预测方法&#xff0c;优化阈值设置&a…

前端精度问题全解析:用“挖掘机”快速“填平精度坑”的完美解决方案

写在前面 “为什么我的计算在 React Native 中总是出现奇怪的精度问题?” —— 这可能是许多开发者在作前端程序猿的朋友们都会遇到的第一个头疼问题。本文将深入探讨前端精度问题的根源,我将以RN为例,并提供一系列实用解决方案,让你的应用告别计算误差。 一、精度问题的…