在MySQL开发中,存储过程和函数是两类重要的可编程对象。它们能把多条SQL逻辑封装到数据库服务端,减少网络交互并提升执行效率。存储过程通过CALL调用,常用于完成插入、更新、查询等组合操作;函数则必须返回结果,并且可以直接写在SELECT等SQL表达式中。理解二者的差异与适用场景,是编写高效数据库程序的基础。

一、存储过程的基本语法
使用CREATE PROCEDURE可以定义一个过程,通过IN、OUT、INOUT声明参数模式。下面示例创建一个根据部门编号统计人数的过程:
DELIMITER // CREATE PROCEDURE count_by_dept(IN dept_id INT, OUT total INT) BEGIN SELECT COUNT(*) INTO total FROM employee WHERE department_id = dept_id; END // DELIMITER ;
调用时需要使用CALL语句,并通过用户变量接收OUT参数:
CALL count_by_dept(10, @cnt); SELECT @cnt;
二、函数的定义与调用
函数使用CREATE FUNCTION定义,必须指定返回类型,且函数体内部通过RETURN返回值。以下函数根据员工编号计算年薪:
DELIMITER // CREATE FUNCTION annual_salary(emp_id INT) RETURNS DECIMAL(10,2) DETERMINISTIC BEGIN DECLARE sal DECIMAL(10,2); SELECT salary * 12 INTO sal FROM employee WHERE id = emp_id; RETURN sal; END // DELIMITER ;
函数可以在查询中像普通表达式一样使用:
SELECT name, annual_salary(id) AS year_pay FROM employee WHERE id = 1001;
三、过程与函数的核心区别
| 对比项 | 存储过程 | 函数 |
|---|---|---|
| 返回值 | 可通过OUT返回多个值 | 必须且只能返回一个值 |
| 调用方式 | CALL proc_name() | 嵌入SQL表达式 |
| 事务控制 | 内部可使用COMMIT/ROLLBACK | 一般不包含事务语句 |
四、应用建议
- 批量数据处理、报表生成优先使用存储过程。
- 需要在SELECT中复用的计算逻辑写成函数。
- 避免在函数内执行耗时查询,防止拖慢整条SQL。
- 为过程与函数添加注释,便于后期维护。
五、查看与删除对象
通过SHOW语句可列出已有对象,使用DROP移除不再需要的逻辑:
SHOW PROCEDURE STATUS LIKE 'count_by_dept'; SHOW FUNCTION STATUS LIKE 'annual_salary'; DROP PROCEDURE IF EXISTS count_by_dept; DROP FUNCTION IF EXISTS annual_salary;
合理运用MySQL的过程与函数,可以让数据层逻辑更清晰,也能显著降低应用与数据库之间的通信成本。
MySQLstored_procedurefunction修改时间:2026-07-27 18:30:38