学习MySQL的第十二天

夕阳西下

云霞满天

一、存储过程概述

1.1 理解

含义:存储过程的英文是 Stored Procedure。它的思想很简单,就是一组经过预先编译的SQL语句的封装。

执行过程:存储过程预先存储在MySQL服务器上,需要执行的时候,客户端只需要向服务器端发出调用存储过程的命令,服务器端就可以把预先存储好的这一系列SQL语句全部执行。

好处:

1、简化操作,提高了sql语句的重用性,减少了开发程序员的压力

2、减少操作过程中的失误,提高效率

3、减少网络传输量(客户端不需要把所有的SQL语句通过网络发给服务器)

4、减少了SQL语句暴露在网上的风险,也提高了数据查询的安全性

分类:

存储过程的参数类型可以是IN、OUT和INOUT。根据这点分类如下:

1、没有参数(无参数无返回)

2、仅仅带IN类型(有参数无返回)

3、仅仅带OUT类型(无参数有返回)

4、既带IN又带OUT(有参数有返回)

5、带INOUT(有参数有返回)

注意:IN、OUT、INOUT都可以在一个存储过程中带多个。

1.2 创建存储过程

*CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 函数类型,...)

characteristics ...

BEGIN
存储过程体
END;*

(1)创建存储过程 SELECT_all_data(),查看 company 表中的所有数据
sql 复制代码
CREATE PROCEDURE cunchu()
BEGIN
  SELECT * FROM company;
END;
(2)存储过程的调用
sql 复制代码
CALL cunchu()
(3)示例:查询最高工资
sql 复制代码
CREATE PROCEDURE MaxSalary()
BEGIN
  SELECT e.salary,e.employee_name
  FROM employee e
  WHERE e.salary = (
    SELECT MAX(salary)
    FROM employee
  );  /*每个命令结束后都要加上`;`*/
END;

CALL MaxSalary();
(4)用in 参数输入员工姓名
sql 复制代码
CREATE PROCEDURE ININ(IN name VARCHAR(20))
BEGIN
  SELECT * FROM employee
  WHERE employee.employee_name = name;
END;

CALL inin('王强');
(5)带 in 和 out

用 IN 输入员工姓名,用out输出员工薪资

sql 复制代码
CREATE PROCEDURE GetSalaryByName(IN name VARCHAR(20),OUT salary decimal(10,2))
BEGIN
  SELECT employee.salary INTO salary
  FROM employee
  WHERE employee.employee_name = name;
END;

# CALL调用OUT参数,要传 变量(@变量名)而不是普通变量名。

-- 先定义一个变量用来接收输出
SET @salary = 0;

-- 再调用存储过程
CALL GetSalaryByName('王强', @salary);

-- 最后查看输出的工资
SELECT @salary;
(6)创建带 INOUT 参数的存储过程
sql 复制代码
CREATE PROCEDURE GetNameSalary(INOUT name_salary DECIMAL(10,2))
BEGIN
  SELECT salary INTO name_salary
  FROM Employee
  WHERE employee_name = '张强'  -- 这里可以改成动态的
  LIMIT 1;
END;

-- 先定义变量
SET @salary = 0;

-- 调用存储过程
CALL GetNameSalary(@salary);

-- 查询变量
SELECT @salary;

/*
传一个值进去 name_salary,虽然进来的值是什么无所谓。

存储过程内部会把张强的工资查出来,重新赋值给 name_salary。

最后 name_salary就变成了工资。
*/

二、修改、查看、删除

2.1 查看全部
sql 复制代码
SHOW CREATE PROCEDURE MaxSalary
2.2 查看存储过程\函数的状态信息
sql 复制代码
SHOW PROCEDURE STATUS;  # 查看全部

SHOW PROCEDURE STATUS LIKE 'MaxSalary'; # 查看某一个存储过程

SHOW FUNCTION STATUS LIKE 'MaxSalary'; # 查看某一个函数
2.3 从information_schema.Routines表中查看存储过程和函数的信息

ROUTINES 视图不仅可以查到过程/函数的名字、类型,还能看到比如定义者、创建时间、安全类型、具体定义体(ROUTINE_DEFINITION)等信息。
SELECT * FROM information_schema.ROUTINES
WHERE ROUTINE_NAME = 'MaxSalary' AND ROUTINE_TYPE = 'PROCEDURE';

2.4 修改

修改存储过程或函数,不影响存储过程或函数功能,只是修改相关特性。使用ALTER语句实现

2.5 删除

因为 MySQL 不支持直接修改存储过程,所以最常见的方法是:先删除(DROP),再重新创建(CREATE)

sql 复制代码
-- 删除已有存储过程
DROP PROCEDURE IF EXISTS MaxSalary;

-- 重新创建
DELIMITER //

CREATE PROCEDURE MaxSalary()
BEGIN
    -- 新的逻辑代码
END //

DELIMITER ;

# DELIMITER 用来告诉 MySQL 现在用 // 作为结束符,避免中间的 ; 提前结束。

三、结语

风浪还没停歇,我宣告奔跑的意义

须知少日拏云志,曾许人间第一流。我们还年轻,我们还有无限可能!

相关推荐
zru_960217 分钟前
Windows 安装 MongoDB 教程
数据库·mongodb
yuhouxiyang30 分钟前
学习海康VisionMaster之路径提取
学习·计算机视觉
爱吃烤鸡翅的酸菜鱼44 分钟前
【SpringMVC】概念引入与连接
java·开发语言·mysql
数据与后端架构提升之路1 小时前
深度解析如何将图像帧和音频片段特征高效存储到向量数据库 Milvus
数据库·opencv·音视频
20242817李臻2 小时前
李臻20242817_安全文件传输系统项目报告_第9周
数据库·安全
小白考证进阶中2 小时前
0基础可以考MySQL OCP么?备考时间需要多久?
数据库·mysql·开闭原则
PLUS_WAVE2 小时前
CogCoM: A Visual Language Model with Chain-of-Manipulations Reasoning 学习笔记
学习·语言模型·大模型·cot·vlm·推理模型·reasoning
观无2 小时前
Redis远程链接应用案例
数据库·redis·缓存·c#
绵绵细雨中的乡音2 小时前
Linux进程学习【环境变量】&&进程优先级
linux·运维·学习
星星点点洲2 小时前
【缓存与数据库结合方案】伪从技术 vs 直接同步/MQ方案的深度对比
数据库·缓存