mysql 存储过程和自定义函数 详解
首先创建存储过程或者自定义函数时,都要使用use database 切换到目标数据库,因为存储过程和自定义函数都是属于某个数据库的。
存储过程是一种预编译的 SQL 代码集合,封装在数据库对象中。以下是一些常见的存储过程的关键字:
存储过程
1. 存储过程的定义
-
CREATE PROCEDURE: 用于创建一个新的存储过程。
CREATE PROCEDURE procedure_name (parameter_list) BEGIN-- 存储过程体 END; -
DROP PROCEDURE: 用于删除已存在的存储过程。
DROP PROCEDURE procedure_name;
2. 参数定义
-
IN: 表示输入参数。
-
OUT: 表示输出参数。
-
INOUT: 表示既可以输入又可以输出的参数。
CREATE PROCEDURE my_procedure(IN param1 INT, OUT param2 INT) BEGIN-- 存储过程体 END;
3. 变量声明与操作
-
DECLARE: 定义局部变量、条件和游标。
DECLARE var1 INT DEFAULT 0; DECLARE var2 VARCHAR(50); -
SET: 用于给变量赋值。
SET var1 = 10;
4. 控制流程
-
BEGIN/END: 标记存储过程块的开始和结束。
BEGIN-- 存储过程体 END; -
IF 条件判断
IF语句用于简单的条件分支。语法格式:
IF condition THENSQL逻辑 ELSEIF condition THENSQL逻辑 ELSESQL逻辑 END IF;案例:
根据用户 ID 返回不同的信息。
DELIMITER // CREATE PROCEDURE CheckUser(IN userId VARCHAR(32)) BEGINDECLARE userName VARCHAR(32);IF userId = 'APP-2016-00494878' THENSELECT username INTO userName FROM users WHERE userid = userId;SELECT userName;ELSEIF userId = 'APP-2016-7777777' THENSELECT userage INTO userName FROM users WHERE userid = userId;SELECT userName;ELSESELECT userId;END IF; END // DELIMITER ;调用存储过程:
CALL CheckUser('APP-2016-00494878'); -
CASE: 用于多条件判断。
-
语法格式:
CASEWHEN condition1 THENSQL逻辑WHEN condition2 THENSQL逻辑ELSESQL逻辑 END CASE; -
根据用户角色返回不同的权限级别。
-
DELIMITER // CREATE PROCEDURE GetUserRole(IN userId INT) BEGINDECLARE userRole VARCHAR(20);SELECT role INTO userRole FROM users WHERE id = userId;CASE userRoleWHEN 'admin' THENSELECT 'Administrator';WHEN 'user' THENSELECT 'Standard User';ELSESELECT 'Guest';END CASE; END // DELIMITER ;调用存储过程:
CALL GetUserRole(1); -
LOOP/WHILE/REPEAT: 实现循环操作。
LOOP_LABEL: LOOP-- 循环体IF condition THENLEAVE LOOP_LABEL;END IF; END LOOP;
WHILE 循环
WHILE 循环在条件为真时执行循环体中的 SQL 语句。
语法格式:
WHILE 条件 DOSQL逻辑
END WHILE;
案例:
计算从 1 累加到 n 的值,n 为传入的参数值。
DELIMITER //
CREATE PROCEDURE CalculateSum(IN n INT)
BEGINDECLARE total INT DEFAULT 0;WHILE n > 0 DOSET total = total + n;SET n = n - 1;END WHILE;SELECT total;
END //
DELIMITER ;
调用存储过程:
CALL CalculateSum(100);
REPEAT 循环
REPEAT 循环至少执行一次循环体中的 SQL 语句,直到条件为真时退出循环。
语法格式:
REPEATSQL逻辑
UNTIL 条件
END REPEAT;
案例:
计算从 1 累加到 n 的值,n 为传入的参数值。
DELIMITER //
CREATE PROCEDURE CalculateSumRepeat(IN n INT)
BEGINDECLARE total INT DEFAULT 0;REPEATSET total = total + n;SET n = n - 1;UNTIL n <= 0END REPEAT;SELECT total;
END //
DELIMITER ;
调用存储过程:
CALL CalculateSumRepeat(100);
LOOP 循环
LOOP 循环是无条件循环,通常与 LEAVE 语句结合使用来退出循环。
语法格式:
[loop_label:] LOOPSQL逻辑
END LOOP [loop_label];
案例:
计算从 1 累加到 n 的值,n 为传入的参数值。
DELIMITER //
CREATE PROCEDURE CalculateSumLoop(IN n INT)
BEGINDECLARE total INT DEFAULT 0;sum_loop: LOOPIF n <= 0 THENLEAVE sum_loop;END IF;SET total = total + n;SET n = n - 1;END LOOP sum_loop;SELECT total;
END //
DELIMITER ;
调用存储过程:
CALL CalculateSumLoop(100);
5. 条件处理
-
DECLARE HANDLER: 定义异常处理程序。
DECLARE CONTINUE HANDLER FOR SQL_ERROR_CODE error_code BEGIN-- 异常处理语句 END;
6. 游标操作
-
DECLARE CURSOR: 声明游标。
DECLARE cursor_name CURSOR FOR SELECT column1, column2 FROM table WHERE condition; -
OPEN CURSOR: 打开游标。
OPEN cursor_name; -
FETCH CURSOR: 读取游标数据。
FETCH cursor_name INTO var1, var2; -
CLOSE CURSOR: 关闭游标。
CLOSE cursor_name;
7. 调试与优化
-
SET: 调整优化器参数。
SET optimizer_switch = 'index_merge=on'; -
SHOW VARIABLES: 查看系统变量。
SHOW VARIABLES LIKE 'optimizer_switch';
8.案例
以下是一个包含事务处理的存储过程示例:
DELIMITER //CREATE PROCEDURE transfer_funds(IN from_account INT, IN to_account INT, IN amount DECIMAL(10,2))
BEGINSTART TRANSACTION;IF amount > 0 THEN-- 从源账户扣除金额UPDATE accounts SET balance = balance - amount WHERE id = from_account;-- 向目标账户增加金额UPDATE accounts SET balance = balance + amount WHERE id = to_account;-- 提交事务COMMIT;ELSE-- 回滚事务ROLLBACK;END IF;
END //DELIMITER ;
这个存储过程通过事务确保资金转账操作的原子性。
9.补充知识:游标
注意事项
-
游标只能在存储过程和函数中使用。
-
游标是只读的,不能用于修改数据,但可以通过
SELECT查询结果集。 -
需要显式地打开和关闭游标,以确保资源的正确释放。
通过使用游标,可以对查询结果集进行逐行处理,这对于需要对每行数据执行复杂操作的场景非常有用
DELIMITER //
CREATE PROCEDURE ProcessOrders()
BEGINDECLARE done INT DEFAULT 0;DECLARE orderId INT;DECLARE orderStatus VARCHAR(20);-- 声明一个名为 cur 的游标。-- 该游标基于查询 SELECT id, status FROM orders,用于存储查询结果集。-- 可以通过游标逐行访问和操作 orders 表中的每一行数据。DECLARE cur CURSOR FOR SELECT id, status FROM orders;-- 定义一个异常处理程序,当游标遍历完所有行(触发 NOT FOUND 异常)时,将变量 done 设置为 1。DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;OPEN cur; -- 打开游标order_loop: LOOPFETCH cur INTO orderId, orderStatus; -- 从游标中提取数据IF done THENLEAVE order_loop; -- 如果没有更多数据,退出循环END IF;-- 在这里处理每一行数据UPDATE orders SET status = 'processed' WHERE id = orderId;END LOOP order_loop;CLOSE cur; -- 关闭游标
END //
DELIMITER ;
在这个存储过程中,当游标遍历完所有行时,FETCH cur INTO orderId, orderStatus 会触发 NOT FOUND 异常。此时,CONTINUE HANDLER 将 done 设置为 1,退出循环。
通过这种方式,可以优雅地处理游标遍历完成的情况,确保程序不会因异常而中断。
10.查询当前数据库有哪些存储过程
SELECT SPECIFIC_NAME AS '存储过程名', ROUTINE_SCHEMA AS '数据库名', CREATED AS '创建时间', LAST_ALTERED AS '最后修改时间'
FROM information_schema.ROUTINES
WHERE ROUTINE_TYPE = 'PROCEDURE'AND ROUTINE_SCHEMA = 'test_mybatis';
自定义函数
1. 定义自定义函数
-
CREATE FUNCTION: 用于创建一个新的自定义函数。
CREATE FUNCTION function_name (parameter_list) RETURNS return_type BEGIN-- 函数体 END;-
function_name: 函数名称。
-
parameter_list: 参数列表,参数可以是
IN类型。 -
RETURNS: 指定函数返回值的类型。
-
2. 参数定义
-
IN: 定义输入参数。MySQL 的自定义函数只支持
IN类型的参数。CREATE FUNCTION add_numbers(IN a INT, IN b INT) RETURNS INT BEGINRETURN a + b; END;
3. 函数体
-
BEGIN/END: 标记函数体的开始和结束。
BEGIN-- 函数逻辑 END;
4. 返回值
-
RETURN: 用于返回函数的计算结果。
RETURN value;
5. 属性
-
DETERMINISTIC 或 NOT DETERMINISTIC: 标记函数是否是确定性的。
-
确定性函数:对于相同的输入参数总是返回相同的结果。
-
非确定性函数:对于相同的输入参数可能返回不同的结果。
CREATE FUNCTION function_name (parameter_list) RETURNS return_type DETERMINISTIC BEGIN-- 函数逻辑 END; -
6. 修改或删除函数
-
ALTER FUNCTION: 修改已存在的自定义函数。
-
DROP FUNCTION: 删除已存在的自定义函数。
DROP FUNCTION function_name;
7. 调用函数
-
可以直接在 SQL 语句中调用自定义函数。
SELECT add_numbers(5, 10);
存储过程和自定义函数区别
| 特性 | 存储过程 | 自定义函数 |
|---|---|---|
| 定义 | 是一组预编译的 SQL 语句和流程控制语句的集合,可以包含多个 SQL 语句和复杂逻辑。 | 是一个用户定义的函数,用于封装特定的功能逻辑,返回一个值。 |
| 返回值 | 可以没有返回值,也可以通过 OUT 参数返回多个值。 | 必须返回一个值,返回值类型在创建函数时指定。 |
| 参数类型 | 支持 IN、OUT 和 INOUT 类型的参数。 | 只支持 IN 类型的参数。 |
| 调用方式 | 使用 CALL 语句调用,不能在 SELECT 中直接调用。 | 可以在 SQL 语句中直接调用,如 SELECT、WHERE、ORDER BY 等。 |
| 事务处理 | 可以包含事务操作,控制事务的提交和回滚。 | 不支持事务操作。 |
| 代码重用 | 适合封装复杂的业务逻辑,便于维护和代码重用。 | 适合封装简单的逻辑,如计算、转换或条件判断,便于在多个地方重用。 |
| 性能 | 存储过程在服务器端执行,与应用程序交互次数少,性能较高。 | 自定义函数在查询中调用时,可能会导致性能问题,需要谨慎使用。 |
| 适用场景 | 适用于执行复杂操作的场景,如批量更新数据、执行多个 SQL 语句或返回结果集。 | 适用于需要返回单个值的场景,如计算、转换或简单的逻辑判断。 |
总结
-
存储过程:适合执行复杂的操作,可以返回多个值或结果集,适用于批量更新数据、执行多个 SQL 语句或返回结果集等场景。
-
自定义函数:适合返回单个值的简单逻辑,可以直接在 SQL 语句中调用,适用于计算、转换或条件判断等场景。
相关文章:
mysql 存储过程和自定义函数 详解
首先创建存储过程或者自定义函数时,都要使用use database 切换到目标数据库,因为存储过程和自定义函数都是属于某个数据库的。 存储过程是一种预编译的 SQL 代码集合,封装在数据库对象中。以下是一些常见的存储过程的关键字: 存…...
C++ 中的 cJSON 解析库:用法、实现及递归解析算法与内存高效管理
在现代软件开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其易于阅读和编写、易于机器解析和生成的特性,被广泛应用于各种场景。C 作为一种强大的编程语言,自然也需要一个高效的…...
websocket自动重连封装
websocket自动重连封装 前端代码封装 import { ref, onUnmounted } from vue;interface WebSocketOptions {url: string;protocols?: string | string[];reconnectTimeout?: number; }class WebSocketService {private ws: WebSocket | null null;private callbacks: { [k…...
【C语言】球球大作战游戏
目录 1. 前期准备 2. 玩家操作 3. 生成地图 4. 敌人移动 5. 吃掉小球 6. 完整代码 1. 前期准备 游戏设定:小球的位置、小球的半径、以及小球的颜色 这里我们可以用一个结构体数组来存放这些要素,以方便初始化小球的信息。 struct Ball {int x;int y;float r;DWORD c…...
人工智能D* Lite 算法-动态障碍物处理、多步预测和启发式函数优化
在智能驾驶领域,D* Lite 算法是一种高效的动态路径规划算法,适用于处理环境变化时的路径重规划问题。以下将为你展示 D* Lite 算法的高级用法,包含动态障碍物处理、多步预测和启发式函数优化等方面的代码实现。 代码实现 import heapq impo…...
MySQL 8版本认证问题
目录 问题: Public Key Retrieval is not allowed原因: mysql 8.0 调整身份认证机制解决方法(三种) 问题: Public Key Retrieval is not allowed 连接MySQL8数据库的时候,报错内容如下:“Publi…...
Android 开发APP中参数配置与读取总结
以使用MQTT配置的参数 MQTT_BROKER_UR 、MQTT_USER_NAME、 MQTT_PASSWORD为例,说明配置设置和读取应用 项目中使用系统参数(如环境变量和gradle.properties文件中的属性)在Gradle构建脚本中,以下是一个详细的操作文档资料&…...
Scala 语法入门
Scala语法入门 1. 定义变量2. 定义方法3. 闭包4. 声明字符串5. 声明数组6. 声明集合7. 异常处理 1. 定义变量 (变量的类型在变量名之后等号之前声明) 不可变变量(val) 类似于 Java 中的 final 变量,即一旦赋值后,其值不能再被改…...
python中的flask框架
Flask 是一个用Python编写的轻量级Web应用框架 基于WSGI和Jinja2模板引擎 被称为“微框架”,其核心功能简单,不捆绑数据库管理、表单验证等功能,而是通过扩展来增加其他功能 Flask提供最基本的功能,不强制使用特定工具或库 通…...
【redis】缓存设计规范
本文是 Redis 键值设计的 14 个核心规范与最佳实践,按重要程度分层说明: 一、通用数据类型选择 这里我们先给出常规的选择路径图。 以下是对每个步骤的分析: 是否需要排序?: zset(有序集合)用…...
归一化与伪彩:LabVIEW图像处理的区别
在LabVIEW的图像处理领域,归一化(Normalization)和伪彩(Pseudo-coloring)是两个不同的概念,虽然它们都涉及图像像素值的调整,但目的和实现方式截然不同。归一化用于调整像素值的范围,…...
DeepSeek大模型本地部署实战
1. 下载并安装Ollama 打开浏览器:使用你常用的浏览器(如Chrome、Firefox等)访问Ollama的官方网站。无需特殊网络环境,直接搜索“Ollama”即可找到。 登录与下载:进入Ollama官网后,点击右上角的“Download…...
deepseek+kimi自动生成ppt
打开deepseek官网,输入详细的需求,让他生成个ppt 接着deepseek开始思考生成了 接着复制生成了的内容 打开kimi粘贴刚才deepseek生成的内容 可以一键生成啦,下载编辑使用吧...
集成SwanLab与HuggingFace TRL:跟踪与优化强化学习实验
文章目录 1. 引入SwanLabCallback2. 传入Trainer3. 完整案例代码4. GUI效果展示 TRL (Transformers Reinforcement Learning,用强化学习训练Transformers模型) 是一个领先的Python库,旨在通过监督微调(SFT)、近端策略优化…...
cefsharp131升级132测试(WinForms.NETCore)
一、升级(Nuget) 版本说明(readme):最低.NET Core3.1 (NET5.0) Visual C 2019 Redist 二、试运行、兼容性测试 三、后记说明 支持H264版本推荐版本63,79,84,88,100,111,125(支持h264和pdf预览) 其他H264版…...
Gitee AI上线:开启免费DeepSeek模型新时代
Gitee Al上线,并宣布开启免费DeepSeek模型的时代,这是一个非常值得关注的消息,因 为它标志着国内在AI领域的一个重要发展。DeepSeek模型是由阿里巴巴达摩院开发的,旨 在提供强大的自然语言处理(NLP)能力。下面是一些关于这一事件…...
nginx常用命令及补充
在Linux环境下nginx常用命令如下: 1、查看nginx版本号命令 nginx -v 2、查找nginx配置文件路径已经检查配置文件是否正确 nginx -t 3、查找nginx安装目录 which nginx 4、查看nginx进程 ps -ef|grep nginx 5、进入到nginx的sbin目录后,执行一下…...
自动驾驶---聊聊传统规控和端到端
1 背景 在自动驾驶领域中,端到端模型的兴起确实对传统的规划控制方法(笔者并不同意网上以Rule-Base称呼传统规控,传统的规控其实也使用了很多优化算法和博弈算法)产生了挑战,但这就意味着传统规控方法就完全没有应用了…...
node.js + html + Sealos容器云 搭建简易多人实时聊天室demo 带源码
node.js html Sealos容器云 搭建简易多人实时聊天室demo 带源码 前言功能介绍(demo演示)sealos官网配置node.js 编写服务端代码前端ui 调用接口整体项目目录部署到服务器 前言 hello哦盆友们,这次我们来十几行代码做一个超简单的多人聊天…...
OpenFeign远程调用返回的是List<T>类型的数据
在使用 OpenFeign 进行远程调用时,如果接口返回的是 List 类型的数据,可以通过以下方式处理: 直接定义返回类型为List Feign 默认支持 JSON 序列化/反序列化,如果服务端返回的是 List的JSON格式数据,可以直接在 Feig…...
asp毕业设计下载(全套源码+配套论文)——基于asp+sqlserver的WEB社区论坛设计与实现
基于aspsqlserver的WEB社区论坛设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于aspsqlserver的WEB社区论坛设计与实现,更多精选毕业设计项目下载见文末哦。 文章目录: 基于aspsqlserver的WEB社区论坛设计与…...
PyTorch实战(38)——深度学习模型可解释性
PyTorch实战(38)——深度学习模型可解释性0. 前言1. PyTorch 模型可解释性2. 训练手写数字分类器3. 可视化模型卷积核4. 可视化特征图小结系列链接0. 前言 在本专栏中,我们已经构建了多种深度学习模型来完成不同任务,包括手写数字…...
OpenClaw量化对比:Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF不同精度版本的自动化任务表现
OpenClaw量化对比:Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF不同精度版本的自动化任务表现 1. 测试背景与实验设计 去年在开发一个自动化文档处理流程时,我发现OpenClaw的任务成功率与底层模型量化精度密切相关。当时使用Q8版本处理Excel文…...
s2-pro效果惊艳展示:情感化语音合成——喜悦、平静、关切语调
s2-pro效果惊艳展示:情感化语音合成——喜悦、平静、关切语调 1. 专业级语音合成新标杆 s2-pro作为Fish Audio开源的专业级语音合成模型镜像,正在重新定义文本转语音的技术边界。不同于传统单调的语音合成,这款工具能够精准捕捉并复现人类语…...
文明降级运动:回归纸笔抵抗AI监控
在AI技术席卷软件测试领域的浪潮中,一个看似“倒退”却极具战略意义的趋势正在兴起——文明降级运动。这场运动的核心是主动回归纸笔工具,以抵抗AI监控带来的系统性风险。作为软件测试从业者,我们身处技术前沿,见证了AI在缺陷预测…...
2026最权威一键生成论文工具榜单:这些被高校和导师悄悄推荐的软件你用了吗
一键生成论文工具正成为学术研究的重要助力,其高效性与专业性在近年来得到广泛认可。依托权威检测平台数据、高校实测反馈及用户真实评价,这些工具已逐步成为科研工作者和学生群体的得力助手。本文将盘点2026年最受高校和导师推荐的一键生成论文软件&…...
比迪丽AI绘画创意开发:使用Matlab进行生成效果分析
比迪丽AI绘画创意开发:使用Matlab进行生成效果分析 1. 引言 在AI绘画创作领域,比迪丽模型因其出色的角色生成能力而备受关注。但如何科学评估生成效果、量化分析风格特征,一直是创作者面临的挑战。传统的人工评估方式主观性强、效率低下&am…...
Pencil:重新定义设计与开发的边界
🎨 Pencil:重新定义设计与开发的边界 更多问题讨论和资料获取,请关注文章最后的微信公众号 当"设计即代码"成为现实,前端开发者的工作流正在经历一场革命 📖 什么是 Pencil? 如果你是一名前端开…...
Qwen-Rapid-AIO终极教程:8秒完成专业级AI图像编辑的完整指南
Qwen-Rapid-AIO终极教程:8秒完成专业级AI图像编辑的完整指南 【免费下载链接】Qwen-Image-Edit-Rapid-AIO 项目地址: https://ai.gitcode.com/hf_mirrors/Phr00t/Qwen-Image-Edit-Rapid-AIO 你是否曾经因为AI图像编辑工具操作复杂而头疼?是否厌倦…...
ROS2新手必看:用turtlesim小乌龟快速入门机器人仿真(附完整安装指南)
ROS2实战入门:从turtlesim小乌龟探索机器人仿真世界 引言:为什么选择turtlesim作为ROS2的起点? 在机器人操作系统(ROS)的学习道路上,很多开发者都会遇到一个共同的困境:理论概念抽象难懂,而直接上手复杂项…...
