当前位置: 首页 > 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.dtcms.com/a/346936.html

相关文章:

  • OCR、文档解析工具合集(下)
  • MySQL InnoDB引擎
  • STM32F1 SysTick介绍及应用
  • Nacos-12--扩展:@RefreshScope和@ConfigurationProperties实现热更新的原理
  • PHP - 线程安全 - 疑问与答案
  • springboot 表现层消息一致性处理:前后端数据协议
  • SpringMVC相关自动配置
  • 第1篇:走进日志框架的世界 - 从HelloWorld到企业级应用
  • C++中, new对象时有哪几种情况会导致new失败
  • piclist+gitee操作指南
  • DeepSeek V3.1深度解析:一个模型两种思维,迈向Agent时代的第一步!
  • 屏幕类型与信号接口
  • 不用 if-else,Spring Boot 怎么知道 ?status=10 是哪个枚举?
  • 全面解析JVM预热:原理、价值与实践指南
  • Mybatis Plus - 代码生成器简单使用
  • SSE实时通信与前端联调实战
  • 内网穿透教程
  • 亚马逊布局墨西哥低价赛道:Amazon Bazaar的战略逻辑与卖家破局路径
  • STM32CubeIDE V1.9.0下载资源链接
  • 水体反光 + 遮挡难题破解!陌讯多模态融合算法在智慧水务的实测优化
  • RAG学习(六)——检索优化技术进阶
  • Sqlserver存储过程
  • 拼豆设计生成器(支持大写字母、数字,颜色自定义)
  • 力扣 30 天 JavaScript 挑战 第38天 (第九题)学习了 语句表达式的区别 高级函数 promise async await 节流
  • 三、Bpmnjs 核心组件与架构介绍
  • 深入剖析结构体内存对齐
  • 达梦数据库巡检常用SQL(一)
  • Base64 编码优化 Web 图片加载:异步响应式架构(Java 后端 + 前端全流程实现)
  • Linux问答题:分析和存储日志
  • [特殊字符] 在 Windows 新电脑上配置 GitHub SSH 的完整记录(含坑点与解决方案)