阿杰,我来帮你系统整理一下 MySQL 存储过程详解,包含概念、语法、参数、优缺点和示例,适合入门+复习。
📘 1. 存储过程是什么?
- 存储过程(Stored Procedure)是一组 预编译 的 SQL 语句集合,存放在数据库服务器中。
- 开发者/应用可以通过 调用存储过程 来执行一系列 SQL 逻辑,而不需要每次都发送完整 SQL 脚本。
👉 类似于数据库中的“函数”,但是存储过程一般没有返回值(但可以通过 OUT 参数 或 结果集 输出)。
📘 2. 存储过程的优点和缺点
✅ 优点
- 执行效率高:SQL 已预编译存储在数据库里,调用更快。
- 减少网络传输:客户端只需调用过程,不必发送大段 SQL。
- 可复用:复杂逻辑写一次,多个应用都能调用。
- 安全性高:可控制用户只调用存储过程,而不直接操作表。
❌ 缺点
- 跨平台差:不同数据库语法不同(MySQL/Oracle/SQL Server 不完全通用)。
- 调试不方便:比应用层逻辑调试更难。
- 维护成本高:逻辑写在数据库层,修改需要 DBA 介入。
📘 3. 基本语法
DELIMITER $$ -- 修改结束符,避免和存储过程中的分号冲突
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
-- SQL 语句
END $$
DELIMITER ; -- 恢复默认结束符
📘 4. 参数类型
存储过程支持三类参数:
- IN:输入参数(默认)
- OUT:输出参数
- INOUT:既可输入也可输出
📌 示例:
CREATE PROCEDURE demo_proc(IN in_param INT, OUT out_param INT, INOUT inout_param INT)
BEGIN
SET out_param = in_param * 2;
SET inout_param = inout_param + 1;
END;
📘 5. 调用存储过程
CALL 存储过程名(参数列表);
📌 示例:
SET @out_val = 0;
SET @inout_val = 5;
CALL demo_proc(10, @out_val, @inout_val);
SELECT @out_val, @inout_val;
📘 6. 变量与控制语句
定义变量
DECLARE v_name VARCHAR(20);
SET v_name = '阿杰';
条件判断
IF condition THEN
-- SQL语句
ELSEIF condition THEN
-- SQL语句
ELSE
-- SQL语句
END IF;
循环语句
WHILE condition DO
-- SQL语句
END WHILE;
📘 7. 示例:查询学生成绩等级
DELIMITER $$
CREATE PROCEDURE get_grade(IN score INT, OUT grade VARCHAR(10))
BEGIN
IF score >= 90 THEN
SET grade = '优秀';
ELSEIF score >= 75 THEN
SET grade = '良好';
ELSEIF score >= 60 THEN
SET grade = '及格';
ELSE
SET grade = '不及格';
END IF;
END $$
DELIMITER ;
-- 调用
SET @g = '';
CALL get_grade(82, @g);
SELECT @g; -- 输出 '良好'
📘 8. 查看与删除存储过程
- 查看已有存储过程:
SHOW PROCEDURE STATUS WHERE Db = '数据库名';
- 查看存储过程定义:
SHOW CREATE PROCEDURE 存储过程名;
- 删除存储过程:
DROP PROCEDURE 存储过程名;
📘 9. 适用场景
- 批量数据处理(例如批量计算工资、批量迁移数据)。
- 业务逻辑与数据紧密相关时(如金融、报表统计)。
- 提升性能:减少应用与数据库的交互次数。
✅ 总结:
- 存储过程是数据库里封装 SQL 逻辑的一种方式。
- 语法要点:
DELIMITER
、参数类型(IN/OUT/INOUT)、控制语句(IF/WHILE/CASE)。 - 适用场景:数据处理、复杂逻辑复用,但不适合所有业务逻辑都写在存储过程里。
发表回复