在数据库(如 MySQL、Oracle、SQL Server 等)中,**存储过程(Stored Procedure)和函数(Function)**都是一组预编译的 SQL 语句,用于封装业务逻辑、提高复用性和执行效率,但它们在设计目的和使用方式上有明显区别。
下面从多个维度对比说明:
| 对比项 | 存储过程 | 函数 |
|---|---|---|
| 是否返回值 | 可返回 0 个、1 个或多个结果集 | 必须返回一个值 |
| 调用方式 | 使用 CALL / EXEC |
可在 SQL 语句中直接调用(如 SELECT) |
| 能否用于 SQL 表达式 | ❌ 不能 | ✅ 可以 |
OUT / INOUT 参数返回值CREATE PROCEDURE get_user(IN uid INT, OUT uname VARCHAR(50))
BEGIN
SELECT name INTO uname FROM user WHERE id = uid;
END;
CREATE FUNCTION get_user_name(uid INT)
RETURNS VARCHAR(50)
BEGIN
DECLARE uname VARCHAR(50);
SELECT name INTO uname FROM user WHERE id = uid;
RETURN uname;
END;
CALL get_user(1, @name);
SELECT get_user_name(1);
或用在表达式中:
SELECT * FROM user WHERE get_user_name(id) = 'Tom';
| 项目 | 存储过程 | 函数 |
|---|---|---|
| 是否可写数据 | ✅ 可以(INSERT/UPDATE/DELETE) | ❌ 通常不允许(尤其是 SQL 标准函数) |
| 事务控制 | ✅ 可包含事务 | ❌ 一般不能 |
在多数数据库中,函数应尽量是“纯函数”,不修改数据。
INOUTINOUTIN存储过程用于“做事情”,函数用于“算结果”。
如果你愿意,我也可以结合 MySQL / Oracle / SQL Server 的具体语法再详细讲一遍。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。