MySQL | 存储过程快速入门
文章目录
- 一、概述
- 1.1 MySQL存储过程和函数的概念
- 1.2 优势和适用场景
- 二、存储过程基础
- 2.1 存储过程与传统SQL查询的区别
- 2.2 创建和调用存储过程
- 创建存储过程
- 调用存储过程
- 2.3 参数传递与返回值
- 创建带有输出参数的存储过程
- 调用带有输出参数的存储过程
- 2.4 流程控制语句
- IF语句
- WHILE循环
- 三、存储过程高级特性
- 3.1 存储过程中的异常处理
- 3.2 游标的使用
- 3.3 动态SQL语句
- 3.4 存储过程的优化技巧
- 四、存储过程和函数的安全性
- 4.1 数据安全和防止SQL注入
- 使用参数化查询
- 4.2 存储过程权限管理
- 授权用户执行存储过程的权限
- 4.3 存储过程和函数的性能安全性考虑
- 避免过度复杂的存储过程
- 定期优化存储过程和函数
- 最后
一、概述
1.1 MySQL存储过程和函数的概念
MySQL存储过程和函数是一组SQL语句的集合,它们被保存在数据库中,可以像调用普通SQL语句一样进行调用。存储过程是一种可重复使用的过程,而函数则返回一个单一值。存储过程和函数通常使用SQL语法和流程控制语句,使得它们能够在数据库服务器上执行复杂的操作,并减少了客户端与数据库之间的数据传输。
1.2 优势和适用场景
-
优势:
- 性能提升:存储过程和函数在数据库服务器端执行,可以减少客户端与数据库之间的网络通信,从而提高了查询和数据操作的性能。
- 代码复用:存储过程和函数可以在多个应用程序中重复使用,减少了代码的冗余和维护成本。
- 安全性增强:通过存储过程和函数来执行数据库操作,可以避免直接向客户端开放数据库表,增加了数据的安全性。
- 简化复杂操作:存储过程和函数支持流程控制语句,可以实现复杂的业务逻辑,简化了大规模数据操作和计算。
-
适用场景:
- 频繁执行的查询:对于一些频繁执行的查询,将其封装成存储过程可以避免重复编写相同的SQL语句。
- 复杂的数据操作:对于复杂的数据计算和处理,使用存储过程和函数可以在数据库服务器上高效完成,减轻了应用程序的负担。
- 提高数据库性能:通过存储过程和函数的优化,可以提高数据库的性能和响应速度,减少数据库负载。
- 保证数据安全性:将数据操作封装在存储过程中,可以限制对敏感数据的访问权限,增强了数据的安全性。
二、存储过程基础
2.1 存储过程与传统SQL查询的区别
在传统SQL查询中,我们直接执行SQL语句,而存储过程是一组预先定义好的SQL语句的集合,可以在数据库中保存并多次调用。存储过程的主要区别在于:
- 存储过程的执行:存储过程需要在数据库服务器上执行,而传统SQL查询可以在客户端直接执行。
- 执行频率:存储过程适用于经常执行的操作,可以减少客户端与服务器之间的数据传输,提高性能。
- 代码封装:存储过程将一系列SQL语句封装在一起,使得应用程序可以通过存储过程名来调用,简化了代码的维护和管理。
2.2 创建和调用存储过程
创建存储过程
-- 创建一个简单的存储过程,查询员工信息
DELIMITER //
CREATE PROCEDURE GetEmployeeById(IN employeeId INT)
BEGINSELECT * FROM employees WHERE id = employeeId;
END //
DELIMITER ;
调用存储过程
-- 调用刚才创建的存储过程,传入参数employeeId=1
CALL GetEmployeeById(1);
2.3 参数传递与返回值
存储过程可以接收参数,也可以返回值。参数用于向存储过程传递数据,返回值用于存储过程执行结果的输出。
创建带有输出参数的存储过程
DELIMITER //
CREATE PROCEDURE GetEmployeeName(IN employeeId INT, OUT employeeName VARCHAR(50))
BEGINSELECT name INTO employeeName FROM employees WHERE id = employeeId;
END //
DELIMITER ;
调用带有输出参数的存储过程
-- 调用存储过程,并将查询结果赋值给@name变量
SET @name = '';
CALL GetEmployeeName(1, @name);
SELECT @name;
2.4 流程控制语句
存储过程支持流程控制语句,用于实现复杂的逻辑判断和循环操作。
IF语句
CREATE PROCEDURE TestIfStatement(IN num INT)
BEGINIF num > 0 THENSELECT 'Number is positive' AS Result;ELSEIF num < 0 THENSELECT 'Number is negative' AS Result;ELSESELECT 'Number is zero' AS Result;END IF;
END;
WHILE循环
CREATE PROCEDURE TestWhileLoop(IN num INT)
BEGINDECLARE i INT DEFAULT 1;WHILE i <= num DOSELECT i AS Number;SET i = i + 1;END WHILE;
END;
三、存储过程高级特性
3.1 存储过程中的异常处理
在存储过程中,我们可以使用异常处理来处理可能出现的错误情况,增加代码的健壮性。
-- 创建带有异常处理的存储过程
DELIMITER //
CREATE PROCEDURE DivideNumbers(IN num1 INT, IN num2 INT)
BEGINDECLARE EXIT HANDLER FOR SQLEXCEPTIONBEGINSELECT 'Error: Division by zero' AS ErrorMessage;END;IF num2 = 0 THENSIGNAL SQLSTATE '45000'SET MESSAGE_TEXT = 'Error: Division by zero';ELSESELECT num1 / num2 AS Result;END IF;
END //
DELIMITER ;
3.2 游标的使用
游标允许在存储过程中对结果集进行迭代,类似于其他编程语言中的迭代器。
-- 创建带有游标的存储过程
DELIMITER //
CREATE PROCEDURE GetAllEmployees()
BEGINDECLARE done INT DEFAULT FALSE;DECLARE employeeId INT;DECLARE employeeName VARCHAR(50);DECLARE cur CURSOR FOR SELECT id, name FROM employees;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;OPEN cur;read_loop: LOOPFETCH cur INTO employeeId, employeeName;IF done THENLEAVE read_loop;END IF;-- 在此处处理数据,例如打印员工信息SELECT CONCAT('Employee ID: ', employeeId, ', Name: ', employeeName) AS EmployeeInfo;END LOOP;CLOSE cur;
END //
DELIMITER ;
3.3 动态SQL语句
动态SQL语句允许在运行时构建和执行SQL语句,增加了存储过程的灵活性。
-- 创建带有动态SQL的存储过程
DELIMITER //
CREATE PROCEDURE DynamicQuery(IN columnName VARCHAR(50), IN value VARCHAR(50))
BEGINSET @query = CONCAT('SELECT * FROM employees WHERE ', columnName, ' = ''', value, '''');PREPARE stmt FROM @query;EXECUTE stmt;DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
3.4 存储过程的优化技巧
为了提高存储过程的性能和可维护性,我们可以考虑以下优化技巧:
- 优化查询语句:确保查询语句的性能良好,避免全表扫描和不必要的索引使用。
- 避免循环执行SQL:在存储过程中尽量避免在循环中执行大量SQL语句,可以使用集合操作或子查询来替代。
- 使用合适的数据类型:在存储过程中使用合适大小的数据类型,避免造成数据溢出或浪费存储空间。
四、存储过程和函数的安全性
4.1 数据安全和防止SQL注入
数据安全是数据库应用中至关重要的一环。在存储过程和函数的设计中,我们需要注意以下几个方面,以确保数据的安全性和防止SQL注入攻击。
使用参数化查询
-- 示例:使用参数化查询,防止SQL注入
CREATE PROCEDURE GetEmployeeByName(IN employeeName VARCHAR(50))
BEGINSET @query = 'SELECT * FROM employees WHERE name = ?';PREPARE stmt FROM @query;EXECUTE stmt USING employeeName;DEALLOCATE PREPARE stmt;
END;
4.2 存储过程权限管理
对于存储过程和函数的执行权限,我们需要进行适当的管理,确保只有授权用户可以访问和调用这些存储过程和函数。
授权用户执行存储过程的权限
-- 示例:授权用户执行存储过程的权限
GRANT EXECUTE ON PROCEDURE GetEmployeeByName TO 'user1'@'localhost';
4.3 存储过程和函数的性能安全性考虑
为了保证存储过程和函数的性能和安全性,我们可以考虑以下几个方面。
避免过度复杂的存储过程
-- 示例:避免过度复杂的存储过程
CREATE PROCEDURE ComplexProcedure()
BEGIN-- 避免在存储过程中执行过多的复杂逻辑和查询-- 可以将复杂操作拆分成多个简单的存储过程进行调用
END;
定期优化存储过程和函数
-- 示例:定期优化存储过程和函数
-- 使用EXPLAIN来分析存储过程的查询性能
EXPLAIN SELECT * FROM employees;
最后
MySQL的存储过程和函数为数据库开发带来了更多可能性,同时也需要注意合理使用和安全管理,确保系统的稳定性和可靠性。
相关文章:
MySQL | 存储过程快速入门
文章目录 一、概述1.1 MySQL存储过程和函数的概念1.2 优势和适用场景 二、存储过程基础2.1 存储过程与传统SQL查询的区别2.2 创建和调用存储过程创建存储过程调用存储过程 2.3 参数传递与返回值创建带有输出参数的存储过程调用带有输出参数的存储过程 2.4 流程控制语句IF语句WH…...

C# 图表控件库 ScottPlot
推荐使用ScottPlot原因: 1.图形界面简洁,样式丰富 2.代码较少 3.官方提供多种实例源码,并可以直接通过图形界面查看,便于快速开发 Github源码链接:https://github.com/ScottPlot/ScottPlot 官网WindowFrom Demo实例…...

013 怎么查看自己电脑的wifi密码
方法一:查看当前电脑连接的无线密码 步骤1: 打开windows命令行窗口,输入:ncpa.cpl 快速打开“控制面板”中的“网络连接”,如下图: 步骤2: 右键,打开“状态” 步骤3:…...
深入了解 LoRaWAN® MAC 命令
本文深入探讨了用于 LoRaWAN 网络管理的 MAC 命令。它面向终端设备软件开发人员和使用 LoRa 构建设备的团队经理,这些设备实现了LoRaWAN 链路层规范 v1.0.4。本文帮助您了解不同类型的 MAC 命令、每个命令的用途以及如何解释这些命令。 已经使用LoRaMAC-Node™等软件来处理 MA…...
跨境电商与隐擎fox指纹浏览器:保障安全与效率的完美结合
随着全球化的发展,跨境电商已成为各国贸易的重要组成部分。然而,随之而来的风险和挑战也日益增多,其中之一就是关联浏览器和多开浏览器可能带来的安全隐患。为了确保跨境电商的顺利运营和数据安全,隐擎fox指纹浏览器作为一种防关联…...

【网络编程】五种网络IO模式
对于一次IO访问(以read为例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说,当一个read操作发生时,会经历两个阶段: 1、等待数据准…...
面试总结-2023版
本文受众主要为,互联网技术研发人员。 技术面试一般三面和HRBP面不太会卡人,主要都是停在了一面和二面上。我这次换工作前期主要是一面通过率比较低,后面主要是二面通过低。 总结影响面试通过的几点因素: 是否真的招人…...

bigemap在草原行业的应用案例
一.为什么选择Bigemap 1.使用软件一般都用于套坐标以及空间规划图,方便于项目选址和居民建房报建 2.在卫星图上找到用地范围,然后打点,导出点位范围的2000坐标,用于汇报出图 3.CGCS2000坐标系通过矢量转换转成地方坐标系...

DevOps系列文章之 java调用python脚本
在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐) 调用python脚本中的函数 简单介绍 官网地址 首页 | (jython.org) Jython项目提供了Java中的Python实现, 为Python提供了…...
PHP异步框架总结
目前主要有: 国产 swoole workerman 国外 framework-x revoltrevolt reactphp amphp async...
vsto excel 可以异步写入值么
在 VSTO (Visual Studio Tools for Office) 中,Excel 可以使用异步方式写入值。异步编程允许您在后台线程中执行耗时的操作,而不会阻塞主线程,从而提高程序的响应性能。 从 .NET 4.5 开始,可以使用异步和 await 关键字来简化异步…...

Android Gradle 骚操作,将两个项目合并到一个项目中
1. 前言 在工作中,由于各种原因,导致需要将两个可单独运行的App项目,合并到一个git仓库里,且单独的App项目里还有其他Module模块。 如果只是将两个项目复制到同一个文件夹下,还是得单独打开各个项目,是很不…...

虹科案例|如何分析设备故障时间和次数,打破生产瓶颈?
虹科设备绩效管理系统 保障生产设备的稳定性和可靠性 生产设备的稳定性和可靠性是保证企业正常生产的重要条件之一,设备故障的频发严重影响企业的正常生产,那么如何分析设备故障时间和次数,查找设备故障原因,协助企业打破生产瓶…...

SVN代码迁移到Git方法
1.在SVN上新增一个项目 一、点击新建项目 二、创建空白项目 三、填入项目信息 四、myProject项目模板创建成功 2.将代码提交到Git 一、新建一个文件夹myProject,将从SVN下载过来的代码复制一份拷贝到该文件夹下,注意:不要把.SVN文件拷…...
Linux更换阿里云yum源
1、备份 cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.backup2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/ wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo如果出现解析错误 Could not resolve host: mirrors.a…...

【1.3】Java微服务:Spring Cloud版本说明
✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 💞当前专栏: 微服务 ✨特色专栏: 知识分享 &#x…...

OpenMP
官方文档:OpenMP | LLNL HPC Tutorials OpenMP总览 统一内存访问:OpenMP、Pthreads 非统一内存访问:MPI OpenMP与Pthread OpenMP原理 串行区到达并行区后会派生多个线程,并行区代码执行完后进行线程合并,剩下主线程 编…...

Eureka 学习笔记4:EurekaClient
版本 awsVersion ‘1.11.277’ EurekaClient 接口实现了 LookupService 接口,拥有唯一的实现类 DiscoveryClient 类。 LookupService 接口提供以下功能: 获取注册表根据应用名称获取应用根据实例 id 获取实例信息 public interface LookupService<…...
前端后端路径问题详解
加了项目名,访问所有页面都是 在 项目名下 出来的路径 不加项目名,访问所有页面都不用加项目名,然后前后端的加/的效果都一样,都是在根目录下没有项目名的路径!!! 后端 一、MVC 1.不管是转发…...
@vue/composition-api原理解析
前言 上一篇文章介绍了vue/composition-api是什么,以及为什么要用,现在来系统地解析一下 vue/composition-api 的实现原理,希望可以加深对其工作机制的理解。 老规矩先分享下AI评价:对vue/composition-api实现原理的介绍整体上非…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...

【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...

CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...