阿杰,我来帮你系统整理一下 MySQL 存储过程详解,包含概念、语法、参数、优缺点和示例,适合入门+复习。


📘 1. 存储过程是什么?

  • 存储过程(Stored Procedure)是一组 预编译 的 SQL 语句集合,存放在数据库服务器中。
  • 开发者/应用可以通过 调用存储过程 来执行一系列 SQL 逻辑,而不需要每次都发送完整 SQL 脚本。

👉 类似于数据库中的“函数”,但是存储过程一般没有返回值(但可以通过 OUT 参数 或 结果集 输出)。


📘 2. 存储过程的优点和缺点

✅ 优点

  1. 执行效率高:SQL 已预编译存储在数据库里,调用更快。
  2. 减少网络传输:客户端只需调用过程,不必发送大段 SQL。
  3. 可复用:复杂逻辑写一次,多个应用都能调用。
  4. 安全性高:可控制用户只调用存储过程,而不直接操作表。

❌ 缺点

  1. 跨平台差:不同数据库语法不同(MySQL/Oracle/SQL Server 不完全通用)。
  2. 调试不方便:比应用层逻辑调试更难。
  3. 维护成本高:逻辑写在数据库层,修改需要 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)。
  • 适用场景:数据处理、复杂逻辑复用,但不适合所有业务逻辑都写在存储过程里。