存储过程
存储过程是预先编译并保存在数据库中的一段 SQL 集合,调用时可以接收参数、返回数据,用于封装复用、减少应用与数据库之间的网络交互。
一、介绍与特点
- 思路很简单:就是把 SQL 层面的代码封装起来重复使用。
- 特点:封装复用;可接收参数,也可返回数据;减少网络交互,效率提升。
- 变量、流程控制、游标与条件处理见 存储过程:变量 和 存储过程:流程控制、游标与条件处理。
二、创建、调用、查看、删除
| 操作 | 语法 |
|---|---|
| 创建 | CREATE PROCEDURE 存储过程名称([参数列表]) BEGIN ... END; |
| 调用 | CALL 名称([参数]); |
| 查看指定库的存储过程 | SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = '库名'; |
| 查看某个存储过程的定义 | SHOW CREATE PROCEDURE 存储过程名称; |
| 删除 | DROP PROCEDURE [IF EXISTS] 存储过程名称; |
-- 创建:查询 tb_user 全部数据
CREATE PROCEDURE p1()
BEGIN
SELECT * FROM tb_user;
END;
-- 调用
CALL p1();
命令行中创建存储过程时,
BEGIN ... END内部的;会被客户端提前当作语句结束符,需先用DELIMITER临时改结束符,创建完再改回;,否则报ERROR 1064 (42000)。图形化工具(如 VS Code 的 MySQL 插件)按整块执行,无需处理。
三、参数
| 类型 | 含义 | 备注 |
|---|---|---|
IN | 输入参数,调用时传入值 | 默认 |
OUT | 输出参数,作为返回值 | 调用前一般用会话变量接收 |
INOUT | 既可输入,也可输出 |
CREATE PROCEDURE 存储过程名称([ IN/OUT/INOUT 参数名 参数类型 ])
BEGIN
-- SQL 语句
END;
示例 1:IN + OUT,根据分数返回等级(≥85 优秀;≥60 且 <85 及格;<60 不及格):
CREATE PROCEDURE p4(IN score INT, OUT result VARCHAR(10))
BEGIN
IF score >= 85 THEN
SET result := '优秀';
ELSEIF score >= 60 THEN
SET result := '及格';
ELSE
SET result := '不及格';
END IF;
END;
CALL p4(19, @result);
SELECT @result; -- 不及格
示例 2:INOUT,把 200 分制的分数换算成百分制:
CREATE PROCEDURE p5(INOUT score DOUBLE)
BEGIN
SET score := score * 0.5;
END;
SET @score := 188;
CALL p5(@score);
SELECT @score; -- 94
调用
OUT/INOUT参数时必须传变量(如@result),不能直接传字面量。
速查
CREATE PROCEDURE p1() BEGIN SELECT * FROM tb_user; END;
CALL p1(); -- 调用
SHOW CREATE PROCEDURE p1; -- 查看定义
DROP PROCEDURE IF EXISTS p1; -- 删除
-- OUT 参数:结果存入 @result
CREATE PROCEDURE p4(IN score INT, OUT result VARCHAR(10))
BEGIN
IF score >= 60 THEN SET result := '及格'; ELSE SET result := '不及格'; END IF;
END;
CALL p4(19, @result);
SELECT @result; -- 不及格
| 要做什么 | 用什么 |
|---|---|
| 封装复用 SQL | 存储过程,CALL 调用 |
| 返回值 | OUT / INOUT 参数 |
在 SELECT 中计算 | 见 存储函数 |
相关
- 存储函数:有返回值、可直接放进
SELECT的存储对象 - 存储过程:变量:系统变量、用户变量、局部变量
- 存储过程:流程控制、游标与条件处理:IF / CASE / 循环、游标、Handler
- MySQL 函数:内置函数(字符串 / 数值 / 日期 / 流程)
- 视图:同样是数据库对象,用于封装查询