SQL存储过程是一组为了完成特定功能而预先编写、编译并存储在数据库中的SQL语句集合。它可以被应用程序重复调用,就像数据库端的函数一样。相比在代码里拼SQL,存储过程能减少网络交互、提高执行效率,也便于统一维护业务规则。

SQL存储过程是什么
从本质上讲,存储过程是数据库对象,由数据定义语言和数据操作语言混合组成。创建后,过程会被数据库引擎编译优化,后续调用直接执行二进制计划。它通常支持输入参数、输出参数,也能返回结果集。
- 减少重复SQL编写,逻辑集中在数据库
- 执行计划可缓存,性能相对稳定
- 通过权限控制,可限制表直接访问
如何创建SQL存储过程
以MySQL为例,使用CREATE PROCEDURE语句定义过程,用DELIMITER修改结束符避免与内部分号冲突。下面示例创建一个根据部门编号统计人数的存储过程。
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 ;
参数类型说明
| 类型 | 含义 |
|---|---|
| IN | 调用时传入,过程内部只读 |
| OUT | 过程内部赋值,返回给调用者 |
| INOUT | 既可传入也可返回 |
如何调用SQL存储过程
在MySQL中通过CALL命令执行存储过程。如果含有输出参数,需要先定义用户变量接收。示例如下:
-- 调用并获取输出值 CALL count_by_dept(10, @cnt); SELECT @cnt AS employee_count;
其他数据库的差异
在SQL Server中使用EXEC或EXECUTE调用,在Oracle中常通过BEGIN ... END;匿名块调用。语法细节不同,但核心思想一致。
使用注意事项
存储过程虽好,但不宜把过多复杂业务全部塞入数据库,否则难以调试和版本管理。
建议仅将高频、计算密集或强一致性的操作封装为存储过程,同时写好注释与错误处理,例如MySQL可用DECLARE CONTINUE HANDLER捕获异常。
CREATE PROCEDURE safe_demo()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
-- 发生异常时回滚
ROLLBACK;
END;
START TRANSACTION;
-- 业务逻辑
COMMIT;
END;