存储过程与函数
在 MySQL 中,存储过程(Procedure)和函数(Function) 都属于数据库的可编程对象,作用类似于 Java 中的方法,用于封装一组 SQL 逻辑。
一、存储过程概述
1. 什么是存储过程
存储过程 是一组 预先编译并存储在数据库中的 SQL 语句集合,可以通过名称反复调用。
2. 使用存储过程的好处
- 提高代码复用性
- 简化复杂业务操作
- 减少 SQL 编译次数
- 减少客户端与数据库之间的交互次数,提高性能
二、存储过程的创建与调用
1. 基本语法
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体
END;
2. 参数说明
参数列表由三部分组成:
参数模式 参数名 参数类型
参数模式包括:
- IN:输入参数(默认),由调用方传值
- OUT:输出参数,相当于返回值
- INOUT:既可作为输入,也可作为输出
3. 注意事项
- 存储过程体中每条 SQL 语句必须以分号结尾
- 如果存储过程体只有一条语句,可省略
BEGIN ... END - 创建存储过程时通常需要修改语句结束符
DELIMITER $
4. 调用语法
CALL 存储过程名(实参列表);
三、存储过程示例
1. 无参存储过程
示例:向 admin 表中插入多条数据
DROP TABLE IF EXISTS admin;
CREATE TABLE admin(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20),
password VARCHAR(15)
);
DELIMITER $
CREATE PROCEDURE p1()
BEGIN
INSERT INTO admin
VALUES
(NULL,'Leslie','0000'),
(NULL,'JJ','0111'),
(NULL,'Lily','0011');
END $
DELIMITER ;
CALL p1();
2. 带 IN 参数的存储过程
示例:根据女生姓名查询男友信息
USE girls;
CREATE PROCEDURE p2(IN girlName VARCHAR(20))
BEGIN
SELECT bo.*
FROM boys bo
INNER JOIN beauty b ON bo.id = b.boyfriend_id
WHERE b.name = girlName;
END;
CALL p2('小昭');
3. 带逻辑判断的存储过程
示例:模拟用户登录校验
CREATE PROCEDURE p3(IN uname VARCHAR(20), IN pwd VARCHAR(20))
BEGIN
DECLARE result INT DEFAULT 0;
SELECT COUNT(*) INTO result
FROM admin
WHERE username = uname AND password = pwd;
SELECT IF(result > 0, '成功', '失败') AS 登录结果;
END;
CALL p3('john','8888');
4. 带 OUT 参数的存储过程
示例:根据女生名返回男生名
CREATE PROCEDURE p4(IN girlName VARCHAR(20), OUT boyName VARCHAR(20))
BEGIN
SELECT bo.boyName INTO boyName
FROM boys bo
INNER JOIN beauty b ON bo.id = b.boyfriend_id
WHERE b.name = girlName;
END;
CALL p4('小昭', @boyName);
SELECT @boyName;
5. 多个 OUT 参数
CREATE PROCEDURE p5(
IN girlName VARCHAR(20),
OUT boyName VARCHAR(20),
OUT boyCP INT
)
BEGIN
SELECT bo.boyName, bo.userCP
INTO boyName, boyCP
FROM boys bo
INNER JOIN beauty b ON bo.id = b.boyfriend_id
WHERE b.name = girlName;
END;
CALL p5('小昭', @boyName, @boyCP);
SELECT @boyName, @boyCP;
6. INOUT 参数示例
CREATE PROCEDURE p6(INOUT a INT, INOUT b INT)
BEGIN
SET a = a * 2;
SET b = b * 2;
END;
SET @aNum = 10;
SET @bNum = 6;
CALL p6(@aNum, @bNum);
SELECT @aNum, @bNum;
7. 管理存储过程
-- 查看存储过程
SHOW CREATE PROCEDURE p3;
-- 删除存储过程
DROP PROCEDURE p2;
实际开发中,存储过程一般 不频繁修改。
四、函数(Function)
1. 存储过程与函数的区别
| 对比项 | 存储过程 | 函数 |
|---|---|---|
| 返回值 | 0 个或多个(OUT) | 有且仅有 1 个 |
| 调用方式 | CALL | SELECT |
| 使用场景 | 批量操作、复杂逻辑 | 计算并返回单一结果 |
2. 创建函数语法
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
函数体
END;
说明:
- 参数列表只包含:参数名 + 参数类型
- 函数体中 必须包含 RETURN 语句
- 只有一条语句时,可省略
BEGIN ... END
3. 调用函数
SELECT 函数名(参数列表);
五、函数示例
1. 无参有返回值函数
示例:返回员工总数
USE myemployees;
CREATE FUNCTION f1() RETURNS INT
BEGIN
DECLARE c INT;
SELECT COUNT(*) INTO c FROM employees;
RETURN c;
END;
SELECT f1() AS result;
2. 带参函数
示例:根据员工姓名返回工资
CREATE FUNCTION f2(username VARCHAR(20)) RETURNS INT
BEGIN
DECLARE s INT;
SELECT salary INTO s
FROM employees
WHERE last_name = username;
RETURN s;
END;
SELECT f2('Chen') AS salary;
3. 管理函数
-- 查看函数
SHOW CREATE FUNCTION f1;
-- 删除函数
DROP FUNCTION f1;
六、小结
-
存储过程和函数都用于封装 SQL 逻辑
-
存储过程:
- 适合复杂业务和批量操作
- 可返回多个值
-
函数:
- 必须返回一个值
- 常用于计算型场景
-
合理使用可提升性能与代码可维护性