【MySQL数据库】存储过程与自定义函数(含: SQL变量、分支语句、循环语句 和 游标、异常处理 等内容)
存储过程:一组预编译的SQL语句和流程控制语句,被命名并存储在数据库中。存储过程可以用来封装复杂的数据库操作逻辑,并在需要时进行调用。
类似的操作还有:自定义函数、.sql文件导入。
我们先从熟悉的函数开始说起:
自定义函数
User-Defined Functions(UDF)允许创建 可以在SQL查询中调用的函数,以便在执行特定操作或逻辑。
创建函数:
create function 函数名(参数名 数据类型,...) -- 参数列表
returns 返回值类型
[deterministic]
begin-- 函数体return 返回值;
end;
关键字:deterministic 汉译为 ‘确定的’ 。在MySQL8.0版本以上,创建函数必须在该位置添加关键字,否则会报错:

如果加上关键字deterministic的话:

另外需要注意的是:在指明函数返回值类型时,使用的关键字是 returns,在函数体内部返回值时使用的是 return 。注意区别,不要写错。
删除函数:
将自定义函数删除,语法:
drop function [if exists] myfuc;

调用函数:
使用自定义函数的方法与使用内置函数的方式一样,执行select语句:
select myfuc();

变量
变量的声明:关键字declare
declare variable datatype [default val];-- eg.
declare age int default 18;
变量的赋值:关键字set
set variable = val;-- eg.
set age = age + 10;
注意事项:
第一、函数的参数是已经声明好的变量,无需再次声明,可以直接使用
第二、声明变量的语句必须在函数体的最上方,其次才可以是其它语句
第三、函数体外的SQL语句也可以设置变量,语法为:【set @variable = val】
在函数体内执行sql语句为变量赋值:
-- function_head
begindeclare val int default 0;select count(*) into val from emp;return val;end;
在该示例中,就将查询的结果直接赋给变量val。
结构语句
分支结构
SQL语句中一共有两种分支结构【if/case】,但这两种分支结构的语法用法却与我们熟知的语言的写法不同,但很好理解。下面我们就具体看一下:
第一种分支语句:if then...else if then...else...end if;
if condition1 then-- coding1
else if condition2 then-- coding2
else if condition3 then-- coding3
else--codingn
end if;
与我们常见的C/C++的代码作用域以花括号作为界符不同,SQL语言使用 end显式指定该作用域结束。上面定义函数时begin......end;就已经体现了。在if里面作为begin的等价关键字为:then。编译器一旦识别then就知道进入if的内部作用域了。再次识别到其它的else if或者end if,就会跳出本作用域进入下一个作用域。
第二种分支语句:case when then...when then... else... end case;
casewhen condition1 then-- exp1...;when condition2 then-- exp2...;else-- expn...;
end case;
case语句与我们熟悉的语法也不一样,不过也很好理解:遇到case直接进入分支,然后判断条件,满足即then执行作用域内的逻辑代码或表达式。最后有一个else相当于C/C++中的default,都不满足就给个默认入口。最后以end case结束分支作用域。
循环结构
同样的,循环结构也有两种语法:【while/repeat】。
第一种循环语句:while (bool) do ... end while;
while _condition_
do---- coding --
end while;
当_condition_条件满足时 do执行循环体,直到条件不满足,end while结束循环。
第二种循环语句:repeat ... until (bool) end repeat;
repeat---- coding--
until _condition_
end repeat;
与while循环不同,while循环时满足条件才执行。这种循环语句是,当满足了_condtion_条件时,会结束这个循环。
存储过程
存储过程类似于自定义函数的语法,但是有区别的。例如:无返回值、传入的参数方式不同、可以使用游标等。
基础语法
无参语法:
-- 创建存储过程
create procedure 存储过程名()
begin-- 存储过程的逻辑代码-- 可以包含SQL语句、控制结构和变量操作
end;
调用存储过程:
-- 执行存储过程
call procedure 存储过程名();
删除存储过程:
-- 删除存储过程
drop procedure [if exists] 存储过程名;
参数详解
create procedure 存储过程名([in|out|inout] 参数名 参数的数据类型,[in|out|inout] 参数名 参数的数据类型,......
)
begin-- 存储过程的逻辑代码-- sql语句、结构语句、变量操作等
end;
类型修饰符
存储过程的每个参数都有输入输出修饰,默认为:in输入参数
in(默认):输入参数,存储过程的输入值,从外部传递给存储过程,存储过程内部是只读的,不能修改它的值。【readonly】
out:输出参数,存储过程的返回值,存储过程可以修改它的值并将其返回
inout:输入和输出参数,既可以作为输入值传递给存储过程,也可以由存储过程修改并返回。
进阶语法
我们现在有一个需求,需要查询emp表,为每个员工加100元薪资。
现在遇到的难点是:emp表查询到的结果不是单一结果,只知道sal的字段类型为int,那么如何将结果集的每一条记录依次取出来呢?
我们需要学习一个新的知识:游标-cursor
!!!注意!!!
在MySQL中,存储过程允许使用游标来处理结果集,但函数里不行。可能是因为函数的设计用途不同。函数通常被要求是确定性的,或者至少在某些上下文中不允许有副作用,而游标可能涉及到对结果集的操作,可能引起非确定性的结果或者副作用。或者,函数的执行环境限制了一些操作,比如不允许修改数据库状态,而游标可能用于逐行处理,但函数需要返回单个值,这样的结构不支持
游标
在MySQL中,游标Cursor是一种数据库对象,它能够让你对结果集逐行进行处理。在操作数据库时,普通的SQL语句通常会对整个及进行操作,但在我们上述的场景下,就需要逐行的处理数据,这时有标记就能发挥作用了。
游标的使用步骤:声明=》打开=》读取=》关闭=》释放
-- 声明游标
-- 定义游标的名称 并绑定查询语句
declare cs cursor
for
select empno from emp;
游标就类似于C++实例化出来的对象:cs为对象名,对象类型为cursor-游标,绑定查询语句就是传入构造参数初始化游标的。
-- 打开游标
-- 执行定义好的查询语句 把结果集存在游标中
open cs;
联系熟悉的C++帮助理解:open 就是对象的一个成员函数,作用是执行绑定的sql语句获取结果集的。
-- 读取数据
-- 借助fetch语句从游标逐行获取数据
fetch cs into val;
fetch 就是游标的另一个成员函数:换个名字理解:getNextData-获取下一条数据,内部有一个偏移量,再次执行时,就是取结果集的下一个了。跟文件操作的偏移量联系一下也不难理解。
-- 关闭游标
-- 结束对结果集的操作后,关闭游标以释放资源
close cs;
调用内部成员函数close,相当于调用clear函数
最后还有一个释放游标,也就是从内存中移除游标的阶段。
注意事项:
- 性能问题:游标会对数据库性能产生影响,因为它是逐行处理数据的,所以在大数据集上使用时要谨慎。
- 资源管理:使用完游标后,一定要关闭并释放它,避免资源浪费。
- 异常处理:要考虑游标操作中可能出现的异常,像结果集为空或者到达结果集末尾等情况。
异常处理:错误处理-句柄
上面我们也说了,游标在使用时可能会出现异常情况。例如:循环次数过多,但数据集项数少于循环次数,那么会产生异常情况。下面给出一段代码:
create procedure mypro()
begin declare i int default 0;declare eid int;declare cs cursorforselect empno from emp;open cs;while i<20 dofetch cs into eid;select sal from emp where empno=eid;set i = i+1;end while;close cs;
end;
已知,我们的emp表一共只有14条记录,那怎么从cs中取二十次数据呢?肯定会出错的,这个异常一旦出现,我们如何处理呢?SQL就提供了一种异常处理机制:句柄
句柄-处理类型:
continue - 继续执行后续代码 - 用于可恢复的错误(数据遍历结束)
exit - 退出当前代码块 - 用于不可恢复的错误(如事务冲突)
错误-条件类型:
not found - 未找到
sqlexception - sql异常
sqlwarning - sql警报
特定错误码 -如1062主键冲突
根据笛卡尔积的形式,从两个类型集合中任取一个都可以组成一个异常处理类型。
-- 声明处理句柄declare continue handler for not found set done=1;declare exit handler for sqlexceptionbeginrollback; -- 回滚事务set errmsg="错误信息";end;declare continue handler for sqlwarning set done=2;
感谢大家!
相关文章:
【MySQL数据库】存储过程与自定义函数(含: SQL变量、分支语句、循环语句 和 游标、异常处理 等内容)
存储过程:一组预编译的SQL语句和流程控制语句,被命名并存储在数据库中。存储过程可以用来封装复杂的数据库操作逻辑,并在需要时进行调用。 类似的操作还有:自定义函数、.sql文件导入。 我们先从熟悉的函数开始说起: …...
WEB攻防-PHP反序列化-字符串逃逸
目录 前置知识 字符串逃逸-减少 字符串逃逸-增多 前置知识 1.PHP 在反序列化时,语法是以 ; 作为字段的分隔,以 } 作为结尾,在结束符}之后的任何内容不会影响反序列化的后的结果 class people{ public $namelili; public $age20; } var_du…...
英伟达GTC 2025大会产品全景剖析与未来路线深度洞察分析
【完整版】3月19日,黄仁勋Nvidia GTC 2025 主题演讲|英伟达 英伟达GTC 2025大会产品全景剖析与未来路线深度洞察分析 一、引言 1.1 分析内容 本研究主要采用了文献研究法、数据分析以及专家观点引用相结合的方法。在文献研究方面,广泛收集了…...
基于java的ssm+JSP+MYSQL的九宫格日志网站(含LW+PPT+源码+系统演示视频+安装说明)
系统功能 管理员功能模块: 个人中心 用户管理 日记信息管理 美食信息管理 景点信息管理 新闻推荐管理 日志展示管理 论坛管理 我的收藏管理 管理员管理 留言板管理 系统管理 用户功能模块: 个人中心 日记信息管理 美食信息管理 景点信息…...
【Java】Mybatis学习笔记
目录 一.搭建Mybatis 二.Mybatis核心配置文件解析 1.environment标签 2.typeAliases 3.mappers 三.Mybatis获取参数值 四.Mybatis查询功能 五.特殊的SQL执行 1.模糊查询 2.批量删除 3.动态设置表名 4.添加功能获取自增的主键 六.自定义映射ResultMap 1.配置文件处…...
从DNA到AI:一部35亿年的智能进化史诗
从DNA到AI:一部35亿年的智能进化史诗 一、生命起源:宇宙熵增中的第一缕秩序之光 在35亿年前的地球原始海洋中,DNA的诞生标志着一场伟大的反叛:混沌汤中浮现出能自我复制的有序结构。这种由4种碱基组成的分子,用其双螺…...
遗传算法+四模型+双向网络!GA-CNN-BiLSTM-Attention系列四模型多变量时序预测
遗传算法四模型双向网络!GA-CNN-BiLSTM-Attention系列四模型多变量时序预测 目录 遗传算法四模型双向网络!GA-CNN-BiLSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于GA-CNN-BiLSTM-Attention、CNN-BiL…...
中兴B860AV3.2-T/B860AV3.1-T2_S905L3-B_2+8G_安卓9.0_先线刷+后卡刷固件-完美修复反复重启瑕疵
中兴电信B860AV3.2-T/B860AV3.1-T2_晶晨S905L3-B芯片_28G_安卓9.0_先线刷后卡刷-刷机固件包,完美修复刷机后盒子反复重启的瑕疵。 这两款盒子是可以通刷的,最早这个固件之前论坛本人以及其他水友都有分享交流过不少的固件,大概都…...
Elasticsearch基础教程:从入门到上手
🎯 一、Elasticsearch简介 Elasticsearch(简称ES)是一个分布式、RESTful风格的搜索引擎,支持全文检索、结构化查询、分析和近实时搜索。常用于日志分析、商品搜索、数据分析等场景。 1. 什么是 Elasticsearch? Elas…...
RxSwift 学习笔记第四篇之RxSwift在项目中的简单应用
目录 前言 一、RxCocoa在项目中的用法 1.Target Action 2.代理 3.闭包回调 4.通知 二、一个计时器的例子 前言 在上面的两篇文章中,我们了解到了RxSwift中的Observable和Observer,本篇文章我们主要介绍下RxSwift项目中的使用。 一、RxCocoa在项目中的用法 RxCocoa 给 …...
《Python实战进阶》No27: 日志管理:Logging 模块的最佳实践(下)
No27: 日志管理:Logging 模块的最佳实践(下) 实战案例 :复杂场景下的 Logging 配置与使用 本实战案例在 Python 3.11.5环境下运行通过 在本案例中,我们将通过一个复杂的日志配置示例,全面展示 logging 模…...
Web 小项目: 网页版图书管理系统
目录 最终效果展示 代码 Gitee 地址 1. 引言 2. 留言板 [热身小练习] 2.1 准备工作 - 配置相关 2.2 创建留言表 2.3 创建 Java 类 2.4 定义 Mapper 接口 2.5 controller 2.6 service 3. 图书管理系统 3.1 准备工作 - 配置相关 3.2 创建数据库表 3.2.1 创建用户表…...
【Dive Into Stable Diffusion v3.5】1:开源项目正式发布——深入探索SDv3.5模型全参/LoRA/RLHF训练
目录 1 引言2 项目简介3 快速上手3.1 下载代码3.2 环境配置3.3 项目结构3.4 下载模型与数据集3.5 运行指令3.6 核心参数说明3.6.1 通用参数3.6.2 优化器/学习率3.6.3 数据相关 4 结语 1 引言 在人工智能和机器学习领域,生成模型的应用越来越广泛。Stable Diffusion…...
《Waf 火绒终端防护绕过实战:系统程序副本+Certutil木马下载技术详解》
目录 绕过火绒终端安全软件的详细方法 方法一:利用系统程序副本绕过命令监控 方法二:结合certutil.exe副本下载并执行上线木马 注意事项 总结 实际案例解决方案 前提条件 详细操作步骤 1. 攻击主机(VPS)上的准备工作 2.…...
上海高考解析几何
解析几何的核心思想。 1. 核心分析方法: 自由度引入 方程组中, n n n 个未知数需要 n n n 个等式来解出具体的值。 自由度 性质 一个未知数带来一个自由度,一个等式条件减少一个自由度(减少自由度的方式为消元)。…...
android MutableLiveData setValue 响应速速 postValue 快
MutableLiveData 是 LiveData 的一个可变版本,常用于在ViewModel中保存和管理UI相关的数据。MutableLiveData 提供了两种主要的方法来更新其值:setValue 和 postValue。关于这两者的响应速度,通常认为 setValue 比 postValue 更快。下面详细解释这两者的区别以及影响响应速度…...
【AVRCP】服务发现互操作性:CT 与 TG 的 SDP 协议契约解析
目录 一、服务发现的核心目标:能力画像对齐 二、控制器(CT)服务记录:控制能力的声明 2.1 必选字段:角色与协议的刚性契约 2.1.1 服务类标识(Service Class ID List) 2.1.2 协议描述列表&am…...
MySQL:数据库基础
数据库基础 1.什么是数据库?2.为什么要学习数据库?3.主流的数据库(了解)4.服务器,数据库,表之间的关系5.数据的逻辑存储6.MYSQL架构7.存储引擎 1.什么是数据库? 数据库(Database,简称DB)&#x…...
市场热点复盘20240319
以下是对当前市场热点板块的分析总结,按逻辑分类如下: 一、机器人产业链核心标的 1. 减速器与核心部件 襄阳轴承:直接受益人形机器人减速器轴承需求,技术国内领先。金帝股份:聚焦机器人手指关节谐波减速机保持架&am…...
深入 Linux 声卡驱动开发:核心问题与实战解析
1. 字符设备驱动如何为声卡提供操作接口? 问题背景 在 Linux 系统中,声卡被抽象为字符设备。如何通过代码让应用程序能够访问声卡的录音和播放功能? 核心答案 1.1 字符设备驱动的核心结构 Linux 字符设备驱动通过 file_operations 结构体定…...
鸿蒙下载文件保存到手机本地公共文件夹下、将本地的沙箱目录文件,保存到公共目录,鸿蒙picker save保存文件为空(0字节)的问题
1、首先将下载好的文件,保存到本地目录,这个目录是用户看不到的; 2、然后通过picker的save保存文件,这个picker,它只是获取公共目录uri用的 3、当picker有回调时,将公共目录的uri获取之后,把下…...
OpenNJet动态API设置accessLog开关,颠覆传统运维工作模式
OpenNJet OpenNJet 应用引擎是高性能、轻量级的WEB应用与代理软件。作为云原生服务网格的数据平面,NJet具备动态配置加载、主动式健康检测、集群高可用、声明式API等多种强大功能。通过CoPliot副驾驶服务框架,在隔离控制面和数据面的情况下实现了高可扩…...
案例5_4: 6位数码管轮播0-9【静态显示】
文章目录 文章介绍效果图提示代码(不完整) 文章介绍 5.1.2 数码管静态显示应用举例 要求: 1、仿真图同案例5_3 2、代码参考案例5_3和案例5_2 效果图 提示代码(不完整) #include<reg52.h> // 头文件#define uch…...
navicat忘记已经连接过的数据库密码的操作步骤
第一步: 点击文件-》导出连接 第二步:选中具体的数据库,且勾选左下角的记住密码 第三步:打开刚刚导出的文件,找到对应加密后的密码 第四步:复制密码到工具点击查看密码 注:参考文章链接附…...
Qt窗口坐标体系
坐标系:以左上角为原点(0,0),X向右增加,Y向下增加 对于嵌套窗口,其坐标是相对于父窗口来说的 例如: 通过move方法实现...
DeepSeek写打台球手机小游戏
DeepSeek写打台球手机小游戏 提问 根据提的要求,让DeepSeek整理的需求,进行提问,内容如下: 请生成一个包含以下功能的可运行移动端打台球小游戏H5文件: 要求 可以重新开始游戏 可以暂停游戏 有白球和其他颜色的球&am…...
VR大空间多人互动方案,VR大空间融合AI行为预测的动捕技术
在数字科技迅猛发展的今天,VR大空间技术正逐步成为各行业探索沉浸式体验的重要方向。从企业培训、线上展览到社交元宇宙,VR大空间的应用范围不断拓展。而在这个过程中,多人实时交互成为核心需求,它不仅关乎沉浸感的提升࿰…...
十四、OSG学习笔记-事件响应
上一章节 十三、OSG学习笔记-osgDB文件读写-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146165712 本章节代码: OsgStudy/EventHandle CuiQingCheng/OsgStudy - 码云 - 开源中国https://gitee.com/cuiqingcheng/osg-study/tree/master/Osg…...
JS逆向_腾讯点选_VMP补环境
1.接口分析 1.cap_union_prehandle 说明:图片、jsvmp GET QueryString:{aid: xxxxxx //网站在腾讯登记的idprotocol: httpsaccver: 1showtype: popupua: //ua atob后的结果noheader: 1fb: 1aged: 0enableAged: 0enableDarkMode: 0grayscale: 1clientype: 2cap_cd: uid: lang:…...
【MySQL数据库】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法
在DQL的基础查询中,我们已经学过了多表查询的一种:联合查询(union)。本文我们将系统的讲解多表查询。 笛卡尔积现象 首先,我们想要查询emp表和stu表两个表,按照我们之前的知识栈,我们直接使用…...
