在数据库开发中,SQL存储过程和函数是两种常用的服务端可执行对象。存储过程通过封装多条SQL语句完成特定业务,函数则通常用于计算并返回标量或表结果。理解它们的差异,能让我们把合适逻辑放在数据库层处理。

一、存储过程与函数的核心区别
从使用方式看,存储过程使用CALL或EXEC调用,可包含事务、输出参数;函数能在SELECT语句中像普通列一样使用,但一般不允许修改数据。下面用表格说明主要差异:
| 对比项 | 存储过程 | 函数 |
|---|---|---|
| 调用方式 | CALL proc_name() | SELECT func_name() |
| 返回值 | 可返回多个结果集 | 单一值或表 |
| 事务支持 | 支持 | 通常不支持 |
| 数据修改 | 允许 | 不允许(标量函数) |
二、存储过程实战示例
我们创建一个简单存储过程,根据用户输入的部门编号统计员工人数,并通过输出参数返回。
DELIMITER //
CREATE PROCEDURE count_emp_by_dept(
IN dept_id INT,
OUT emp_count INT
)
BEGIN
SELECT COUNT(*) INTO emp_count
FROM employee
WHERE department_id = dept_id;
END //
DELIMITER ;
-- 调用存储过程
CALL count_emp_by_dept(10, @cnt);
SELECT @cnt AS employee_count;
三、函数实战示例
接着创建一个计算员工年薪的函数,在查询中直接调用。
CREATE FUNCTION calc_annual_salary(monthly_salary DECIMAL(10,2))
RETURNS DECIMAL(12,2)
DETERMINISTIC
BEGIN
RETURN monthly_salary * 12;
END;
-- 在SELECT中使用函数
SELECT emp_name, calc_annual_salary(salary) AS annual
FROM employee
WHERE department_id = 10;
四、如何选择
如果逻辑涉及多步操作、需要事务或返回多个结果,优先用存储过程;如果只是做计算或转换并嵌入查询,用函数更简洁。实际项目中,可以把报表统计写成存储过程,把字段格式化写成函数。
小建议
- 避免在函数里写复杂查询,可能影响性能
- 存储过程命名应体现业务动作,如
sp_update_order_status - 函数尽量声明为
DETERMINISTIC以便优化器缓存
把合适的逻辑放进数据库,不仅减少网络往返,也让应用代码更清爽。
五、总结
SQL存储过程和函数不是互相替代,而是互补工具。理清调用形式和限制,在实战中按需使用,才能发挥数据库最大能力。
SQLstored_procedureuser_defined_function修改时间:2026-07-29 09:39:17