【第十九部分】存储过程与存储函数
【第十九部分】存储过程与存储函数
文章目录
- 【第十九部分】存储过程与存储函数
- 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语句进行封装,便于下次的复用
优点:
- 简化操作,提高了SQL语句的复用,减少了开发程序员的压力
- 减少操作过程中的失误,提高效率
- 减少网络传输量客户端不需要把所有的 SQL 语句通过网络发给服务器
- 减少了 SQL 语句暴露在网上的风险,也提高了数据查询的安全性
缺点:
- 可移植性差,存储过程不能跨数据库移植,比如在 MySQL、Oracle 和 SQL Server 里编写的存储过程,在换成其他数据库时都需要重新编写。
- 调试困难
- 存储过程的版本管理很困难,比如数据表索引发生变化了,可能会导致存储过程失效。
- 它不适合高并发的场景
19.2 创建、调用存储过程
存储过程的参数类型可以分为以下几种情况:
- 没有参数
- IN类型
- OUT类型
- IN和OUT类型
- INOUT类型
-
IN:当前参数为输入参数,也就是表示入参;存储过程只是读取这个参数的值。如果没有定义参数种类,
默认就是 IN,表示输入参数。 -
OUT:当前参数为输出参数,也就是表示出参;执行完成之后,调用这个存储过程的客户端或者应用程序就可以读取这个参数返回的值了。
-
INOUT:当前参数既可以为输入参数,也可以为输出参数。
传入或者输出参数最好先去查看所查询的表的结构,数据类型一一对应上,避免出现其他错误
关于在创建过程中指定对存储过程的约束条件
- [NOT] DETERMINISTIC : DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是不确定的,相同的输入可能得到不同的输出。
- ONTAINS SQL: 当前存储过程的子程序包含SQL语句,但是并不包含读写数据的SQL语句
- NO SQL:存储过程的子程序中不包含任何SQL语句
- READS SQL DATA: 当前存储过程的子程序中包含读数据的SQL语句
- MODIFIES SQL DATA: 当前存储过程的子程序中包含写数据的SQL语句
- SQL SECURITY DEFINER :当前存储过程的创建者或者定义者才能执行当前存储过程
- SQL SECURITY INVOKER : 当前存储过程的访问权限的用户能够执行当前存储过程
- 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 存储函数
-
FUNCTION中总是默认为IN参数
-
RETURNS 返回值类型 该语句表示函数返回数据的类型,RETURNS子句只能对FUNCTION做指定,对存储函数而言这是强制的。
-
函数体也可以用BEGIN…END来表示SQL代码的开始和结束。如果函数体只有一条语句,也可以省略BEGIN…END。
-
关于在创建过程中指定对存储函数的约束条件
- [NOT] DETERMINISTIC : DETERMINISTIC表示结果是确定的。每次执行存储函数时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是不确定的,相同的输入可能得到不同的输出。
- ONTAINS SQL: 当前存储函数的子程序包含SQL语句,但是并不包含读写数据的SQL语句
- NO SQL:存储函数的子程序中不包含任何SQL语句
- READS SQL DATA: 当前存储函数的子程序中包含读数据的SQL语句
- MODIFIES SQL DATA: 当前存储函数的子程序中包含写数据的SQL语句
- SQL SECURITY DEFINER :当前存储函数的创建者或者定义者才能执行当前存储函数
- SQL SECURITY INVOKER : 当前存储函数的访问权限的用户能够执行当前存储函数
- 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 存储函数和存储过程区别
| 类型 | 关键字 | 调用语法 | 返回值 | 应用场景 | 特点 |
|---|---|---|---|---|---|
| 存储过程 | PROCEDURE | CALL 存储过程() | 理解为有0个或多个 | 一般用于更新 | 能够执行对表的操作(比如创建表,删除表等)和事务操作 |
| 存储函数 | FUNCTION | SELECT 函数() | 只能是一个 | 一般用于查询结果为一个值并返回时 | 存储函数可以放在查询语句中使用,存储过程不行 |
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性能测试九、总结(尾部小惊喜)前言 小吴: 现…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...
高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...
