当前位置: 首页 > news >正文

【第十九部分】存储过程与存储函数

【第十九部分】存储过程与存储函数


文章目录

  • 【第十九部分】存储过程与存储函数
  • 19. 存储过程与存储函数
    • 19.1 存储过程
    • 19.2 创建、调用存储过程
      • 19.2.1 不带参数
      • 19.2.2 IN 类型
      • 19.2.3 OUT类型
      • 19.2.4 IN和OUT类型同时使用
      • 19.2.5 INOUT类型
    • 19.3 存储函数
    • 19.4 创建、调用存储函数
    • 19.5 存储函数和存储过程区别
    • 19.6 存储过程和存储函数的查看、删除
      • 19.6.1 查看
      • 19.6.2 删除
  • 总结


19. 存储过程与存储函数

19.1 存储过程

定义: 就是一组经过预先编译的 SQL 语句的封装。

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

与视图相比:相同的优点,清晰、安全,还可以减少网络传输量; 不同是视图是虚拟表,一般只是用来进行展示,不对底层数据进行直接的操作,而存储过程是程序化的 SQL,直接操作底层数据表,可以做更多复杂的数据出力

存储过程类似函数,将常用的SQL语句进行封装,便于下次的复用

优点:

  1. 简化操作,提高了SQL语句的复用,减少了开发程序员的压力
  2. 减少操作过程中的失误,提高效率
  3. 减少网络传输量客户端不需要把所有的 SQL 语句通过网络发给服务器
  4. 减少了 SQL 语句暴露在网上的风险,也提高了数据查询的安全性

缺点

  1. 可移植性差,存储过程不能跨数据库移植,比如在 MySQL、Oracle 和 SQL Server 里编写的存储过程,在换成其他数据库时都需要重新编写。
  2. 调试困难
  3. 存储过程的版本管理很困难,比如数据表索引发生变化了,可能会导致存储过程失效。
  4. 它不适合高并发的场景

19.2 创建、调用存储过程

存储过程的参数类型可以分为以下几种情况:

  1. 没有参数
  2. IN类型
  3. OUT类型
  4. IN和OUT类型
  5. INOUT类型
  • IN:当前参数为输入参数,也就是表示入参

    存储过程只是读取这个参数的值。如果没有定义参数种类,默认就是 IN,表示输入参数。

  • OUT:当前参数为输出参数,也就是表示出参

    执行完成之后,调用这个存储过程的客户端或者应用程序就可以读取这个参数返回的值了

  • INOUT:当前参数既可以为输入参数,也可以为输出参数

传入或者输出参数最好先去查看所查询的表的结构,数据类型一一对应上,避免出现其他错误

关于在创建过程中指定对存储过程的约束条件

  1. [NOT] DETERMINISTIC : DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是不确定的,相同的输入可能得到不同的输出。
  2. ONTAINS SQL: 当前存储过程的子程序包含SQL语句,但是并不包含读写数据的SQL语句
  3. NO SQL:存储过程的子程序中不包含任何SQL语句
  4. READS SQL DATA: 当前存储过程的子程序中包含读数据的SQL语句
  5. MODIFIES SQL DATA: 当前存储过程的子程序中包含写数据的SQL语句
  6. SQL SECURITY DEFINER :当前存储过程的创建者或者定义者才能执行当前存储过程
  7. SQL SECURITY INVOKER : 当前存储过程的访问权限的用户能够执行当前存储过程
  8. COMMENT : 添加注释信息

语法

# DELIMITER 自定义设置结束标记符号 
# 为什么需要去设置结束标记符号,因为MySQL默认的语句结束符号为分号 ; 为了避免与存储过程中SQL语句结束符相冲突,需要使用DELIMITER改变存储过程的结束符。DELIMITER //
CREATE PROCEDURE 存储过程名字(IN|OUT|INOUT 参数名 参数类型,参数名 参数类型 ...)
[约束条件]
BEGIN存储过程体;
END // 
DELIMITER ;  
# 最后将其恢复原来的结束标记符 DELIMITER ; 

19.2.1 不带参数

# 创建存储过程返回各个部门的平均工资
DELIMITER //
CREATE PROCEDURE dep_avg_salary()
BEGINSELECT department_id, AVG(salary) "各部门平均工资"FROM employeesWHERE department_id IS NOT NULLGROUP BY department_id;
END //
DELIMITER ;# 调用存储过程
CALL dep_avg_salary()

19.2.2 IN 类型

# 查询输入员工id,查询他的名字和薪资
DELIMITER //
CREATE PROCEDURE e_info(IN emp_id INT)
BEGINSELECT last_name,salary FROM employeesWHERE employee_id = emp_id;
END //
DELIMITER ;# 调用存储过程
CALL e_info(100)

19.2.3 OUT类型

# 输出公司薪资最高的员工
DELIMITER //
CREATE PROCEDURE best_salary_emp(OUT e_name VARCHAR(25))
BEGIN SELECT last_name INTO e_nameFROM employeesWHERE salary = (SELECT MAX(salary)FROM employees);
END //
DELIMITER ;# OUT类型调用的方式有些不同,加一个@输出名
CALL best_salary_emp(@e_name)
SELECT @e_name

19.2.4 IN和OUT类型同时使用

# 输入指定部门,输出该部门下薪资最低的员工
DELIMITER //
CREATE PROCEDURE select_lowest_salary(IN dep_id INT,OUT e_name VARCHAR(25))
BEGIN SELECT last_name INTO e_nameFROM employeesWHERE department_id = dep_id AND salary = (SELECT MIN(salary)FROM employeesWHERE department_id = dep_id);
END //
DELIMITER ;CALL select_lowest_salary(20,@e_name)
SELECT @e_name

19.2.5 INOUT类型

# 查询某个员工领导的姓名,并用INOUT参数,输入员工姓名,输出领导的姓名
DELIMITER //
CREATE PROCEDURE show_mgr_name(INOUT emp_name VARCHAR(25))
BEGINSELECT last_name INTO emp_nameFROM employeesWHERE employee_id = (SELECT manager_idFROM employeesWHERE last_name = emp_name);		
END //
DELIMITER ;# 调用inout模式的参数
# 先设置一个参数进行传入
SET @emp_name = 'Fay'
CALL show_mgr_name(@emp_name)
SELECT @emp_name

19.3 存储函数

  1. FUNCTION中总是默认为IN参数

  2. RETURNS 返回值类型 该语句表示函数返回数据的类型,RETURNS子句只能对FUNCTION做指定,对存储函数而言这是强制的

  3. 函数体也可以用BEGIN…END来表示SQL代码的开始和结束。如果函数体只有一条语句,也可以省略BEGIN…END。

  4. 关于在创建过程中指定对存储函数的约束条件

    1. [NOT] DETERMINISTIC : DETERMINISTIC表示结果是确定的。每次执行存储函数时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是不确定的,相同的输入可能得到不同的输出。
    2. ONTAINS SQL: 当前存储函数的子程序包含SQL语句,但是并不包含读写数据的SQL语句
    3. NO SQL:存储函数的子程序中不包含任何SQL语句
    4. READS SQL DATA: 当前存储函数的子程序中包含读数据的SQL语句
    5. MODIFIES SQL DATA: 当前存储函数的子程序中包含写数据的SQL语句
    6. SQL SECURITY DEFINER :当前存储函数的创建者或者定义者才能执行当前存储函数
    7. SQL SECURITY INVOKER : 当前存储函数的访问权限的用户能够执行当前存储函数
    8. COMMENT : 添加注释信息

19.4 创建、调用存储函数

# 语法
# 一定要有返回值
DELIMITER //
CREATE FUNCTION 函数名(参数名 参数类型,...) 
RETURNS 返回值类型
[约束条件]
BEGINRETURN(函数体); #函数体中肯定有 RETURN 语句  
END //
DELIMITER ;

使用存储函数

首次创建存储函数失败的话需要加约束条件

# 创建存储函数total_department(),传入部门id,函数返回该部门的人数,返回类型为整型DELIMITER //
CREATE FUNCTION total_department(d_id INT)
RETURNS INT
NOT DETERMINISTIC
READS SQL DATA
SQL SECURITY DEFINER
COMMENT '查询部门总人数'
BEGINRETURN(SELECT COUNT(*) FROM employeesWHERE department_id = d_id);
END //
DELIMITER ;SELECT total_department(80)

19.5 存储函数和存储过程区别

类型关键字调用语法返回值应用场景特点
存储过程PROCEDURECALL 存储过程()理解为有0个或多个一般用于更新能够执行对表的操作(比如创建表,删除表等)和事务操作
存储函数FUNCTIONSELECT 函数()只能是一个一般用于查询结果为一个值并返回时存储函数可以放在查询语句中使用,存储过程不行

19.6 存储过程和存储函数的查看、删除

19.6.1 查看

# 查看创建信息
1. SHOW CREATE {PROCEDURE | FUNCTION} \G  存储过程名或函数名# 查看所有的存储过程或者存储函数的状态,可以用like过滤信息
2. SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'xxx']# information_schema.Routines表中查看存储过程和函数的信息
3. SELECT * FROM information_schema.RoutinesWHERE ROUTINE_NAME='存储过程或函数的名' 

19.6.2 删除

DROP {PROCEDURE | FUNCTION} 存储过程名 | 存储函数名;

总结

以上就是今天要讲的内容,希望对大家有所帮助!!!

相关文章:

【第十九部分】存储过程与存储函数

【第十九部分】存储过程与存储函数 文章目录【第十九部分】存储过程与存储函数19. 存储过程与存储函数19.1 存储过程19.2 创建、调用存储过程19.2.1 不带参数19.2.2 IN 类型19.2.3 OUT类型19.2.4 IN和OUT类型同时使用19.2.5 INOUT类型19.3 存储函数19.4 创建、调用存储函数19.5…...

字节序

字节序 字节序:字节在内存中存储的顺序。 小端字节序:数据的高位字节存储在内存的高位地址,低位字节存储在内存的低位地址 大端字节序:数据的低位字节存储在内存的高位地址,高位字节存储在内存的低位地址 bit ( 比特…...

PDF文件怎么转图片格式?转换有技巧

PDF文件有时为了更美观或者更直观的展现出效果,我们会把它转成图片格式,这样不论是归档总结还是存储起来都会更为高效。有没有合适的转换方法呢?这就来给你们罗列几种我个人用过体验还算不错的方式,大家可以拿来参考一下哈。1.用电…...

筑基七层 —— 数据在内存中的存储?拿来吧你

目录 零:移步 一.修炼必备 二.问题思考 三.整型在内存中的存储 三.大端字节序和小端字节序 四.浮点数在内存中的存储 零:移步 CSDN由于我的排版不怎么好看,我的有道云笔记相当的美观,请移步至有道云笔记 一.修炼必备 1.入门…...

Typecho COS插件实现网站静态资源存储到COS,降低本地存储负载

Typecho 简介Typecho 是一个简单、强大的轻量级开源博客平台,用于建立个人独立博客。它具有高效的性能,支持多种文件格式,并具有对设备的响应式适配功能。Typecho 相对于其他 CMS 还有一些特殊优势:包括可扩展性、不同数据库之间的…...

2月23号作业

题目:题目一:通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作--->上传CSDN 1.例如在串口输入led1on,开饭led1灯点亮 2.例如在串口输入led1off,开饭led1灯熄灭 3.例如在串口输入led2on,开饭led2灯点亮 4.例如在串口输…...

因果推断方法(一)合成控制

知道的跳过下面的简单介绍: 就是比如广告主投放了10w元,那么他的收益怎么算?哪些订单就是广告带来的,哪些是不放广告也会购买? 合成控制法是目前我实际应用发现最好用的。置信度高,且容易理解。 简单讲下思…...

数据结构第12周 :( 有向无环图的拓扑排序 + 拓扑排序和关键路径 + 确定比赛名次 + 割点 )

目录有向无环图的拓扑排序拓扑排序和关键路径确定比赛名次割点有向无环图的拓扑排序 【问题描述】 由某个集合上的一个偏序得到该集合上的一个全序,这个操作被称为拓扑排序。偏序和全序的定义分别如下:若集合X上的关系R是自反的、反对称的和传递的&…...

Linux安装docker(无网)

1. 下载Docker安装包 下载地址:https://download.docker.com/linux/static/stable/x86_64/ 如果服务器可以联网可以通过wget下载安装包 wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.3-ce.tgz2. 解压安装 tar -zxvf docker-18.06…...

解决JNI操作内核节点出现写操作失败的问题

Android 9.0下,因为采取了SEAndroid/SElinux的安全机制,即使拥有root权限,或者对某内核节点设置为777的权限,仍然无法在JNI层访问。 本文将以用户自定义的内核节点/dev/wf_bt为例,手把手教会读者如何在JNI层获得对该节…...

纵然是在产业互联网的时代业已来临的大背景下,人们对于它的认识依然是短浅的

纵然是在产业互联网的时代业已来临的大背景下,人们对于它的认识依然是短浅的。这样一种认识的最为直接的结果,便是我们看到了各式各样的产业互联网平台的出现。如果一定要找到这些互联网平台的特点的话,以产业端为出发点,无疑是它…...

干翻 nio ,王炸 io_uring 来了 !!(图解+史上最全)

大趋势:全链路异步化,性能提升10倍 随着业务的发展,微服务应用的流量越来越大,使用到的资源也越来越多。 在微服务架构下,大量的应用都是 SpringCloud 分布式架构,这种架构总体上是全链路同步模式。 全链…...

ur3+robotiq ft sensor+robotiq 2f 140+realsense d435i配置rviz,gazebo仿真环境

ur3robotiq ft sensorrobotiq 2f 140realsense d435i配置rviz,gazebo仿真环境 搭建环境: ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 reasense: D435i 通过下面几篇博客配置好了ur3、力传…...

ASP.NET Core MVC 项目 AOP之Authorization

目录 一:说明 二:传统鉴权授权的基本配置 三 :角色配置说明 四:策略鉴权授权 五:策略鉴权授权Requirement扩展 总结 一:说明 鉴权:是指验证你是否登录,你登录后的身份是什么。…...

智能新冠疫苗接种助手管理系统

项目背景介绍 近几年来,网络事业,特别是Internet发展速度之快是任何人都始料不及的。目前,由于Internet表现出来的便捷,快速等诸多优势,已经使它成为社会各行各业,甚至是平民大众工作,生活不可缺少的一个重…...

Python+Selenium4元素交互1_web自动化(5)

目录 0. 上节回顾 1. 内置的等待条件 2. 元素属性 1. Python对象属性 2. HTML元素属性 3. 元素的交互 1. 输入框 2. 按钮 3. 单选框和复选框 0. 上节回顾 DEBUG的方式:JS断点 Python断点编程语言提供的等待方式:sleepselenium提供的等待方式&…...

2023双非计算机硕士应战秋招算法岗之深度学习基础知识

word版资料自取链接: 链接:https://pan.baidu.com/s/1H5ZMcUq-V7fxFxb5ObiktQ 提取码:kadm 卷积层 全连接神经网络需要非常多的计算资源才能支撑它来做反向传播和前向传播,所以说全连接神经网络可以存储非常多的参数,…...

Python opencv进行矩形识别

Python opencv进行矩形识别 图像识别中,圆形和矩形识别是最常用的两种,上一篇讲解了圆形识别,本例讲解矩形识别,最后的结果是可以识别出圆心,4个顶点,如下图: 左边是原始图像,右边是识别结果,在我i5 10400的CPU上,执行时间不到8ms。 识别出结果后,计算任意3个顶点…...

网安入门必备的12个kali Linux工具

kali Linux工具帮你评估 Web 服务器的安全性,并帮助你执行黑客渗透测试。 注意:这里不是所提及的所有工具都是开源的。 1. Nmap Nmap ( 网络映射器 )是一款用于 网络发现 和 安全审计 的 网络安全 工具. 主机发现,端口扫描,版本…...

【测试面试】头条大厂,测试开发岗真实一面。你能抵得住吗?

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 小吴: 现…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程

基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...

大数据驱动企业决策智能化的路径与实践

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...