【MySQL】(基础篇十七) —— 存储过程

存储过程

本文将介绍什么是存储过程,为什么要使用存储过程以及如何使用存储过程,并且介绍创建和使用存储过程的基本语法。

MySQL的存储过程是预编译的SQL语句集合,它们作为一个可执行单元存储在数据库中。存储过程能够封装复杂的业务逻辑,接受输入参数,输出结果集,甚至返回值,从而提供了一种高效且模块化的方法来执行常见的或复杂的数据库操作。

创建存储过程的基本语法如下:

sql 复制代码
CREATE PROCEDURE procedure_name (IN|OUT|INOUT param1 datatype, ...)
BEGIN
   -- SQL语句集合
   ...
END;
  • CREATE PROCEDURE 是用来创建存储过程的关键字。
  • procedure_name 是存储过程的名称。
  • (IN|OUT|INOUT param1 datatype, ...)参数列表,其中:
    • IN 参数表示传入值到存储过程中。
    • OUT 参数表示从存储过程中传出值。
    • INOUT 参数既可传入也可传出。
    • param1 datatype 定义参数名及其数据类型。
  • BEGIN...END; 包含了存储过程中的SQL语句。

检查存储过程使用SHOW CREATEP ROCEDURE语句

【示例】创建一个存储过程,用于计算员工的平均工资

sql 复制代码
CREATE PROCEDURE `avg_salary`()
BEGIN
  SELECT AVG(salary) as avgsalary
  FROM employees;
 END

和视图一样,存储过程在被创建之后也会被保存到本地,可以随时查看其sql语句

执行存储过程

调用存储过程使用 CALL 语句,因为存储过程实际上是一种函数,所以存储过程名后需要有()符号(即使不传递参数也需要

【示例】执行上面例子中创建的存储过程

sql 复制代码
CALL avg_salary();

运行结果:

删除存储过程

删除存储过程语法如下:

sql 复制代码
DROP PROCEDURE 存储过程名

使用参数

变量(variable)内存中一个特定的位置,用来临时存储数据。

【示例】创建一个带参数的存储过程employeesalary,实现计算员工工资的最高值、最低值和平均值

sql 复制代码
CREATE PROCEDURE employeesalary(
  OUT sl DECIMAL(8,2),
  OUT sh DECIMAL(8,2),
  OUT sa DECIMAL(8,2)
)
BEGIN
  SELECT MIN(salary)
  INTO sl
  FROM employees;
  SELECT MAX(salary)
  INTO sh
  FROM employees;
  SELECT AVG(salary)
  INTO sa
  FROM employees;
END;

调用存储过程,为几个数据创建对应的变量

sql 复制代码
CALL employeesalary(
  @lowsalary,
  @highsalary,
  @avgsalay
);

查询变量中存储的数据:

sql 复制代码
SELECT @lowsalary

运行结果:

【示例】同时使用IN和OUT参数创建存储过程,查询不同manager管理的用户的数量

sql 复制代码
CREATE PROCEDURE managertotal(
  IN manager INT,
  OUT totalpeople INT
)
BEGIN
  SELECT COUNT(manager_id)
  FROM employees
  WHERE manager_id = manager;
END

调用存储过程:

sql 复制代码
CALL managertotal('100', @total);

运行结果:

相关推荐
银发控、3 小时前
MySQL联合索引
数据库·mysql
予枫的编程笔记4 小时前
【MySQL修炼篇】从踩坑到精通:事务隔离级别的3大异常(脏读/幻读/不可重复读)解决方案
数据库·mysql·后端开发·数据库事务·事务隔离级别·rr级别·脏读幻读不可重复读
一起养小猫5 小时前
Flutter for OpenHarmony 实战:记账应用数据统计与可视化
开发语言·jvm·数据库·flutter·信息可视化·harmonyos
世界尽头与你5 小时前
(修复方案)CVE-2023-22047: Oracle PeopleSoft Enterprise PeopleTools 未授权访问漏洞
数据库·安全·oracle·渗透测试
韩立学长5 小时前
【开题答辩实录分享】以《智能大学宿舍管理系统的设计与实现》为例进行选题答辩实录分享
数据库·spring boot·后端
Henry Zhu1235 小时前
数据库(五):反规范化
数据库
Mr_Xuhhh6 小时前
MySQL函数详解:日期、字符串、数学及其他常用函数
java·数据库·sql
he___H7 小时前
Redis高级数据类型
数据库·redis·缓存
霖霖总总7 小时前
[小技巧60]深入解析 MySQL Online DDL:MySQL Online DDL、pt-osc 与 gh-ost 机制与最佳实践
数据库·mysql
爱学习的阿磊7 小时前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python