Jw
首页
技术
英语
首页
技术
英语
  • MySQL

    • MySQL 基础
    • 环境变量配置(PATH)
    • SQL 语法与分类
    • MySQL 数据类型
    • SQL - DDL 数据定义语言
    • SQL - DML 数据操作语言
    • SQL - DQL 数据查询语言
    • SQL - DCL 数据控制语言
    • MySQL 函数
    • SQL 约束
    • SQL 外键约束
    • 多表关系
    • 多表查询(连接查询)
    • 隐式内连接 vs 显式内连接
    • 子查询
    • 多表查询案例
    • 事务
    • 并发事务问题与隔离级别
    • MySQL 体系结构与存储引擎
    • 索引概述
    • 索引结构
    • 索引分类
    • 索引语法
    • SQL 性能分析
    • 索引使用
    • 索引设计原则
    • SQL 优化 - 插入数据与主键优化
    • SQL 优化 - order by 与 group by
    • SQL 优化 - limit / count / update
    • 视图
    • 存储过程
    • 存储过程 - 变量
    • 存储过程 - 流程控制、游标与条件处理
    • 存储函数
    • 触发器
    • 锁概述与全局锁
    • 表级锁
    • 行级锁
    • InnoDB 逻辑存储结构
    • InnoDB 架构
    • 事务原理(redo / undo log)
    • MVCC
    • MySQL 系统数据库
    • MySQL 常用工具
    • 数据备份与导入导出
    • 错误日志与二进制日志
    • 查询日志与慢查询日志
    • 主从复制 - 概述与原理
    • 主从复制 - 搭建
    • Mycat 配置
    • Mycat 垂直拆分与水平拆分
    • Mycat 分片规则
    • Mycat 管理与监控
    • Mycat 读写分离 - 一主一从
    • Mycat 读写分离 - 双主双从

存储过程

存储过程是预先编译并保存在数据库中的一段 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 函数:内置函数(字符串 / 数值 / 日期 / 流程)
  • 视图:同样是数据库对象,用于封装查询
最近更新: 2026/10/13 22:04
Contributors: liujw
Prev
视图
Next
存储过程 - 变量