学习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 现在用 // 作为结束符,避免中间的 ; 提前结束。

三、结语

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

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

相关推荐
moxiaoran575339 分钟前
uni-app学习笔记三十--request网络请求传参
笔记·学习·uni-app
嘉陵妹妹1 小时前
深度优先算法学习
学习·算法·深度优先
在未来等你1 小时前
SQL进阶之旅 Day 21:临时表与内存表应用
sql·mysql·postgresql·database·temporary-table·memory-table·sql-optimization
乖乖是干饭王2 小时前
Linux系统编程中的_GNU_SOURCE宏
linux·运维·c语言·学习·gnu
敖云岚2 小时前
【Redis】分布式锁的介绍与演进之路
数据库·redis·分布式
LUCIAZZZ2 小时前
HikariCP数据库连接池原理解析
java·jvm·数据库·spring·springboot·线程池·连接池
我在北京coding2 小时前
300道GaussDB(WMS)题目及答案。
数据库·gaussdb
待什么青丝3 小时前
【TMS570LC4357】之相关驱动开发学习记录2
c语言·arm开发·驱动开发·单片机·学习
小Tomkk3 小时前
阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库
数据库·mysql·阿里云
行云流水剑3 小时前
【学习记录】如何使用 Python 提取 PDF 文件中的内容
python·学习·pdf