MySQL存储过程详解

embedded/2025/2/26 16:16:43/

以下是关于 MySQL 存储过程的详细教程,包含基本概念、语法、示例及注意事项:


MySQL 存储过程教程

1. 存储过程是什么?

  • 定义:存储过程(Stored Procedure)是一组预先编译并存储在数据库中的 SQL 语句集合,可通过名称调用。
  • 核心功能
    • 封装复杂业务逻辑。
    • 减少网络传输(只需传递过程名和参数)。
    • 提高代码复用性和执行效率。

2. 存储过程基本语法

2.1 创建存储过程
DELIMITER //CREATE PROCEDURE 存储过程名([参数列表])
BEGIN-- SQL 逻辑
END //DELIMITER ;
  • DELIMITER:修改分隔符(默认 ;),避免与 SQL 语句冲突。
  • 参数格式[IN | OUT | INOUT] 参数名 数据类型
    • IN:输入参数(默认)。
    • OUT:输出参数。
    • INOUT:输入输出参数。
示例:创建简单存储过程
DELIMITER //CREATE PROCEDURE GetUserCount()
BEGINSELECT COUNT(*) FROM users;
END //DELIMITER ;

2.2 调用存储过程
CALL 存储过程名([参数]);

示例

CALL GetUserCount();

2.3 删除存储过程
DROP PROCEDURE IF EXISTS 存储过程名;

3. 存储过程参数

3.1 输入参数(IN)
DELIMITER //CREATE PROCEDURE GetUserByName(IN userName VARCHAR(50))
BEGINSELECT * FROM users WHERE name = userName;
END //DELIMITER ;

调用

CALL GetUserByName('Alice');

3.2 输出参数(OUT)
DELIMITER //CREATE PROCEDURE GetMaxAge(OUT maxAge INT)
BEGINSELECT MAX(age) INTO maxAge FROM users;
END //DELIMITER ;

调用

CALL GetMaxAge(@maxAge);
SELECT @maxAge;

3.3 输入输出参数(INOUT)
DELIMITER //CREATE PROCEDURE DoubleValue(INOUT num INT)
BEGINSET num = num * 2;
END //DELIMITER ;

调用

SET @value = 10;
CALL DoubleValue(@value);
SELECT @value; -- 输出 20

4. 变量与流程控制

4.1 变量声明
DECLARE 变量名 数据类型 [DEFAULT 默认值];

示例

CREATE PROCEDURE CalculateTotal()
BEGINDECLARE total INT DEFAULT 0;SET total = (SELECT SUM(price) FROM orders);SELECT total;
END

4.2 条件判断(IF)
IF 条件 THEN-- 逻辑
ELSEIF 条件 THEN-- 逻辑
ELSE-- 逻辑
END IF;

示例

CREATE PROCEDURE CheckUserStatus(IN userId INT)
BEGINDECLARE status VARCHAR(20);SELECT user_status INTO status FROM users WHERE id = userId;IF status = 'active' THENSELECT '用户活跃';ELSESELECT '用户未活跃';END IF;
END

4.3 循环(WHILE)
WHILE 条件 DO-- 逻辑
END WHILE;

示例:插入 10 条测试数据

CREATE PROCEDURE InsertTestData()
BEGINDECLARE i INT DEFAULT 1;WHILE i <= 10 DOINSERT INTO test_table (value) VALUES (i);SET i = i + 1;END WHILE;
END

5. 异常处理

MySQL 存储过程支持简单的错误处理:

DECLARE 处理动作 HANDLER FOR 错误类型
BEGIN-- 错误处理逻辑
END;

示例

CREATE PROCEDURE SafeInsert()
BEGINDECLARE EXIT HANDLER FOR SQLEXCEPTIONBEGINSELECT '发生错误,操作回滚';ROLLBACK;END;START TRANSACTION;INSERT INTO users (name) VALUES ('Alice');INSERT INTO users (name) VALUES (NULL); -- 触发错误(假设 name 非空)COMMIT;
END

6. 存储过程优缺点

优点
  • 性能优化:减少网络传输,预编译执行。
  • 代码复用:统一业务逻辑。
  • 安全控制:通过权限管理限制数据访问。
缺点
  • 调试困难数据库端调试工具有限。
  • 维护成本:业务逻辑分散在应用层和数据库层。
  • 移植性差:不同数据库语法差异大。

7. 适用场景

  • 复杂查询:多表关联计算或聚合。
  • 批量操作:数据迁移或定时任务。
  • 权限隔离:通过存储过程限制直接表访问。

8. 示例:完整存储过程

示例:用户注册逻辑
DELIMITER //CREATE PROCEDURE RegisterUser(IN p_username VARCHAR(50),IN p_email VARCHAR(100),OUT p_message VARCHAR(100)
BEGINDECLARE userCount INT;-- 检查用户名是否存在SELECT COUNT(*) INTO userCount FROM users WHERE username = p_username;IF userCount > 0 THENSET p_message = '用户名已存在';ELSE-- 插入新用户INSERT INTO users (username, email) VALUES (p_username, p_email);SET p_message = '注册成功';END IF;
END //DELIMITER ;

调用

CALL RegisterUser('alice', 'alice@example.com', @message);
SELECT @message;

9. 总结

  • 核心操作:创建、调用、删除存储过程。
  • 参数类型INOUTINOUT
  • 流程控制:变量、条件、循环、异常处理。
  • 适用场景:优先用于复杂、高频的数据库操作。

通过存储过程,可以将业务逻辑封装在数据库中,但需权衡维护成本和性能收益。


http://www.ppmy.cn/embedded/167295.html

相关文章

eclogy后台运维笔记(写的很乱,只限个人观看)

组织权限&#xff1a; 矩阵管理 这个很重要&#xff0c;比如进行流程操作者的选择时&#xff0c;我们进行需要选择财务部的出纳&#xff0c;会计&#xff0c;总经理。我们不能去直接选定一个人&#xff0c;万一这个人离职了&#xff0c;那所有的流程都要手动修改&#xff0c;…

selenium如何实现,开启浏览器的开发者工具模式,并且开启 toggle移动设备模拟模式

核心实现代码 pythonCopy Code from selenium import webdriver from selenium.webdriver.chrome.options import Options def enable_devtools_with_toggle(): options Options() # 强制开启开发者工具 options.add_argument("--auto-open-devtools-for-tabs&quo…

高并发微服务日志管理:ELK、Loki、Fluentd 终极对决与实战指南

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

LeetCode 热题100 104. 二叉树的最大深度

LeetCode 热题100 | 104. 二叉树的最大深度 大家好&#xff0c;今天我们来解决一道经典的算法题——二叉树的最大深度。这道题在 LeetCode 上被标记为简单难度&#xff0c;要求我们给定一个二叉树的根节点 root&#xff0c;返回其最大深度。下面我将详细讲解解题思路&#xff…

2024年国赛高教杯数学建模D题反潜航空深弹命中概率问题解题全过程文档及程序

2024年国赛高教杯数学建模 D题 反潜航空深弹命中概率问题 原题再现 应用深水炸弹&#xff08;简称深弹&#xff09;反潜&#xff0c;曾是二战时期反潜的重要手段&#xff0c;而随着现代军事技术的发展&#xff0c;鱼雷已成为现代反潜作战的主要武器。但是&#xff0c;在海峡或…

在项目中调用本地Deepseek(接入本地Deepseek)

前言 之前发表的文章已经讲了如何本地部署Deepseek模型&#xff0c;并且如何给Deepseek模型投喂数据、搭建本地知识库&#xff0c;但大部分人不知道怎么应用&#xff0c;让自己的项目接入AI模型。 文末有彩蛋哦&#xff01;&#xff01;&#xff01; 要接入本地部署的deepsee…

c++返回const引用值

c在通过赋值的时候&#xff0c;其实是重载了operator操作符&#xff0c;然后在里面完成了大量操作&#xff0c;把旧变量里的内容一点点复制到新变量里&#xff0c;才完成赋值的。如果旧变量还销毁了&#xff0c;那就浪费更多的计算负荷。 如果返回引用值&#xff0c;则新的变量…

OmniParser V2 与 OmniTool:解锁计算机自动化操控的新境界

在人工智能蓬勃发展的时代,各类自动化工具如雨后春笋般涌现,为人们的工作和生活带来了前所未有的便利。其中,OmniParser V2 与 OmniTool 的组合,凭借其强大的功能和创新的设计,成为了计算机自动化操控领域的焦点。 OmniParser V2 是微软开源的一款极具实力的屏幕解析模型,…