当前位置: 首页 > news >正文

MySQL存储过程入门

引言

在数据库开发中,存储过程是封装复杂业务逻辑、提升执行效率的重要工具。本文将通过基础语法、实战案例和最佳实践,带您快速掌握MySQL存储过程的核心用法。

一、存储过程基础

1.1 定义与优势

存储过程是预编译的SQL语句集合,存储在数据库中,可通过指定名称调用。其核心优势包括:

  • 性能提升:预编译减少解析开销,执行效率更高。
  • 逻辑封装:将多表操作、事务控制等复杂逻辑封装为单一接口。
  • 安全性增强:通过权限控制限制直接表访问,防止SQL注入。
  • 网络优化:批量操作减少客户端-服务器交互次数。

1.2 基本语法

创建存储过程
DELIMITER //
CREATE PROCEDURE procedure_name(IN param1 datatype,OUT param2 datatype
)
BEGIN-- SQL逻辑
END //
DELIMITER ;
  • 参数模式
    • IN:输入参数(默认)。
    • OUT:输出参数。
    • INOUT:输入输出参数。
调用与删除
-- 调用
CALL procedure_name(input_value, @output_var);
-- 删除
DROP PROCEDURE IF EXISTS procedure_name;

二、变量与控制结构

2.1 变量声明

DECLARE var_name datatype DEFAULT default_value; -- 局部变量
SET @user_var = value; -- 用户变量(以@开头)

2.2 控制语句

条件判断
IF condition THEN-- 语句
ELSEIF another_condition THEN-- 语句
ELSE-- 语句
END IF;
循环结构
  • WHILE循环
    WHILE condition DO-- 语句
    END WHILE;
    
  • REPEAT循环
    REPEAT-- 语句
    UNTIL condition
    END REPEAT;
    
  • LOOP循环(配合LEAVE退出):
    label: LOOP-- 语句IF condition THENLEAVE label;END IF;
    END LOOP;
    

三、实战案例

案例1:订单金额拆分

需求:将订单金额拆分为平台抽成和商户结算金额。

DELIMITER //
CREATE PROCEDURE split_order_amount(IN order_id BIGINT,OUT platform_fee DECIMAL(10,2),OUT merchant_fee DECIMAL(10,2)
)
BEGINDECLARE total_amount DECIMAL(10,2);SELECT amount INTO total_amount FROM orders WHERE id = order_id;SET platform_fee = total_amount * 0.03; -- 平台抽成3%SET merchant_fee = total_amount - platform_fee;INSERT INTO split_records(order_id, platform_fee, merchant_fee)VALUES (order_id, platform_fee, merchant_fee);
END //
DELIMITER ;

调用

CALL split_order_amount(1001, @pf, @mf);
SELECT @pf, @mf; -- 查看结果

案例2:用户标签清洗

需求:清洗用户标签中的非法字符。

DELIMITER //
CREATE PROCEDURE clean_user_tags()
BEGINDECLARE done INT DEFAULT FALSE;DECLARE uid BIGINT;DECLARE cur CURSOR FOR SELECT user_id FROM users WHERE tags IS NOT NULL;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;OPEN cur;read_loop: LOOPFETCH cur INTO uid;IF done THENLEAVE read_loop;END IF;UPDATE users SET tags = REGEXP_REPLACE(tags, '[^a-zA-Z0-9,]', '') WHERE user_id = uid;END LOOP;CLOSE cur;
END //
DELIMITER ;

四、注意事项与最佳实践

  1. 变量作用域

    • 局部变量需在BEGIN块内声明,仅在当前块有效。
    • 用户变量以@开头,作用域为当前会话。
  2. 事务处理

    START TRANSACTION;
    -- 操作1
    -- 操作2
    COMMIT; -- 或 ROLLBACK;
    
  3. 性能优化

    • 避免在循环中执行单条UPDATE,改用批量操作。
    • 使用LIMIT和索引优化游标性能。
  4. 调试技巧

    -- 输出中间结果
    SELECT var_name;
    -- 抛出错误
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Error message';
    

五、存储过程 vs 函数

特性存储过程函数
返回值可返回多个结果集或无返回值必须返回单一值
调用方式CALL procedure_name(...)SELECT function_name(...)
参数支持INOUTINOUTIN
使用场景复杂业务逻辑、事务控制简单计算、数据转换

结语

通过本文,您已掌握MySQL存储过程的基础语法、实战案例及最佳实践。在实际项目中合理使用存储过程,可显著提升数据库操作效率与安全性。建议从简单案例入手,逐步尝试封装更复杂的业务逻辑,发挥存储过程的最大价值。

http://www.xdnf.cn/news/1349497.html

相关文章:

  • 中农具身导航赋能智慧农业!AgriVLN:农业机器人的视觉语言导航
  • PostgreSQL15——查询详解
  • Python 十进制转二进制
  • 【每天一个知识点】AIOps 与自动化管理
  • 使用隧道(Tunnel)连接PostgreSQL数据库(解决防火墙问题)(含Java实现代码)
  • AI实验管理神器:WandB全功能解析
  • 【文献阅读】Advances and Challenges in Large Model Compression: A Survey
  • `strncasecmp` 字符串比较函数
  • Unreal Engine IWYU Include What You Use
  • Vue 插槽(Slots)全解析2
  • ubuntu - 终端工具 KConsole安装
  • AI + 教育:个性化学习如何落地?教师角色转变与技术伦理的双重考验
  • SymPy 中抽象函数的推导与具体函数代入
  • Spring Ai 1.0.1中存在的问题:使用MessageChatMemoryAdvisor导致System未被正确的放在首位
  • c++最新进展
  • fdisk工具源码编译生成
  • DAY14-新世纪DL(DeepLearning/深度学习)战士:破(优化算法)2
  • 多线程下为什么用ConcurrentHashMap而不是HashMap
  • 【Android】 连接wifi时,强制应用使用流量
  • 【从零开始java学习|第九篇】方法的相关知识与练习
  • 【微服务的数据一致性分发问题】究极解决方案
  • 日志的配置
  • 一键部署openGauss6.0.2轻量版单节点
  • Spring原理
  • 最近 | 黄淮教务 | 小工具合集
  • 世界模型一种能够对现实世界环境进行仿真,并基于文本、图像、视频和运动等输入数据来生成视频、预测未来状态的生成式 AI 模型
  • Maxscript如何清理3dMax场景?
  • 打工人日报20250822
  • More Effective C++ 条款01:仔细区别 pointers 和 references
  • Java设计模式-外观模式