【重学 MySQL】七十四、揭秘存储过程的强大功能与实战技巧

【重学 MySQL】七十四、揭秘存储过程的强大功能与实战技巧

  • 存储过程简介
  • 存储过程的分类
  • 存储过程的创建
    • 基本语法
    • 语法元素分析
    • 注意点
    • 示例
  • 存储过程的调用
    • 基本语法
    • 语法元素分析
    • 调用示例
    • 注意事项
  • 存储过程的强大功能
  • 实战技巧
  • 示例
  • 总结

在这里插入图片描述

在 MySQL 的学习过程中,存储过程(Stored Procedure)无疑是一个极具价值和灵活性的工具。它不仅可以帮助我们封装复杂的SQL逻辑,还能提高代码的可读性和重用性。接下来,我们将深入探讨存储过程的使用说明,揭秘其强大功能,并分享一些实战技巧。

存储过程简介

存储过程是一组为了完成特定功能的SQL语句集,它存储在数据库中,可以通过调用过程名并传递参数来执行。存储过程可以包含控制结构(如条件判断和循环)、变量声明、异常处理等复杂逻辑,非常适合处理批量数据操作或业务逻辑封装。

存储过程的分类

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

1、没有参数(无参数无返回)
2、仅仅带 IN 类型(有参数无返回)
3、仅仅带 OUT 类型(无参数有返回)
4、既带 IN 又带 OUT(有参数有返回)
5、带 INOUT(有参数有返回)

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

存储过程的创建

创建存储过程是数据库管理中的一个重要任务,它允许你将一系列SQL语句封装成一个可重复使用的代码块。MySQL的存储过程创建语法相对固定,但其中包含了多个关键元素,下面我们将逐一分析这些元素。

基本语法

CREATE PROCEDURE procedure_name (IN|OUT|INOUT parameter_name datatype, ...)
[procedure_characteristic ...]
BEGIN
    -- SQL语句集
END;

语法元素分析

  1. CREATE PROCEDURE

    • 这是创建存储过程的命令关键字。
  2. procedure_name

    • 存储过程的名称,它在数据库中必须是唯一的。你可以根据存储过程的功能来为其命名,以便于理解和记忆。
  3. 参数列表

    • 存储过程可以接受参数,这些参数可以是输入(IN)、输出(OUT)或输入输出(INOUT)类型。
      • IN:表示输入参数,用于向存储过程传递数据。在存储过程中,你可以读取这些参数的值,但不能修改它们。
      • OUT:表示输出参数,用于从存储过程返回数据。在存储过程中,你可以为这些参数赋值,然后这些值将在存储过程结束后返回给调用者。
      • INOUT:表示既可以作为输入也可以作为输出的参数。这意味着你可以在存储过程中读取和修改这些参数的值。
    • datatype:参数的数据类型,如INT、VARCHAR等。
  4. [procedure_characteristic …] 表示创建存储过程时指定的对存储过程的约束条件,其取值信息如下:

    LANGUAGE SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    | COMMENT 'string'
    
    • LANGUAGE SQL:说明存储过程执行体是由SQL语句组成的,当前系统支持的语言为SQL。
    • [NOT] DETERMINISTIC:指明存储过程执行的结果是否确定。DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为NOT DETERMINISTIC。
    • { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL语句的限制。
      • CONTAINS SQL表示当前存储过程的子程序包含SQL语句,但是并不包含读写数据的SQL语句;
      • NO SQL表示当前存储过程的子程序中不包含任何SQL语句;
      • READS SQL DATA表示当前存储过程的子程序中包含读数据的SQL语句;
      • MODIFIES SQL DATA表示当前存储过程的子程序中包含写数据的SQL语句。
      • 默认情况下,系统会指定为CONTAINS SQL
  • SQL SECURITY { DEFINER | INVOKER }:执行当前存储过程的权限,即指明哪些用户能够执行当前存储过程。
    • DEFINER表示只有当前存储过程的创建者或者定义者才能执行当前存储过程;
    • INVOKER表示拥有当前存储过程的访问权限的用户能够执行当前存储过程。
    • 如果没有设置相关的值,则MySQL默认指定值为DEFINER。
  • COMMENT 'string':注释信息,可以用来描述存储过程。
  1. BEGIN … END

    • 这对关键字定义了存储过程的主体部分,即存储过程中要执行的SQL语句集。
    • 在BEGIN和END之间,你可以编写任意数量的SQL语句,包括查询、更新、删除等。
    • 请注意,存储过程中的SQL语句必须遵循MySQL的语法规则。
    • 如果仅仅一条SQL 语句,则可以省略 BEGIN 和 END
  2. DELIMITER(用于命令行客户端):

    • 在MySQL命令行客户端中,默认的分隔符是分号(;)。但是,由于存储过程的定义中可能包含多个分号(用于分隔各个SQL语句),因此你需要使用DELIMITER命令来更改分隔符,以避免在定义存储过程时发生语法错误。
    • 例如,你可以将分隔符更改为//,然后在存储过程的定义中使用//作为结束符。定义完成后,再将分隔符改回分号。
      编写存储过程并不是一件简单的事情,可能存储过程中需要复杂的 SQL 语句。

注意点

  1. BEGIN…END:BEGIN…END 中间包含了多个语句,每个语句都以(;)号为结束符。
  2. DECLARE:DECLARE 用来声明变量,使用的位置在于 BEGIN…END 语句中间,而且需要在其他语句使用之前进行变量的声明。
  3. SET:赋值语句,用于对变量进行赋值。
  4. SELECT… INTO:把从数据表中查询的结果存放到变量中,也就是为变量赋值。
  5. 需要设置新的结束标记:DELIMITER 新的结束标记

因为MySQL默认的语句结束符号为分号‘;’。为了避免与存储过程中SQL语句结束符相冲突,需要使用DELIMITER改变存储过程的结束符。

比如:“DELIMITER //”语句的作用是将MySQL的结束符设置为//,并以“END //”结束存储过程。存储过程定义完毕之后再使用“DELIMITER ;”恢复默认结束符。DELIMITER也可以指定其他符号作为结束符。

当使用DELIMITER命令时,应该避免使用反斜杠(‘\’)字符,因为反斜线是MySQL的转义字符。

示例

以下是一个简单的存储过程示例,它接受两个输入参数并返回它们的和:

DELIMITER //  
  
CREATE PROCEDURE AddTwoNumbers(IN num1 INT, IN num2 INT, OUT sum INT)  
BEGIN  
    SET sum = num1 + num2;  
END //  
  
DELIMITER ;

代码解释:在这个示例中,我们创建了一个名为AddTwoNumbers的存储过程,它接受两个输入参数num1和num2,并计算它们的和,然后通过输出参数sum返回结果。我们使用了DELIMITER命令来更改分隔符,以避免在定义存储过程时发生语法错误。

存储过程的调用

存储过程的调用语法在MySQL中相对简单且直接。

基本语法

CALL procedure_name([parameter[, ...]]);

语法元素分析

  1. CALL

    • 这是调用存储过程的命令关键字。
  2. procedure_name

    • 要调用的存储过程的名称。在MySQL中,存储过程名称在数据库中必须是唯一的。
  3. [parameter[, …]](可选):

    • 存储过程的参数列表。如果存储过程定义了参数,那么在调用时必须提供相应数量的参数值,且参数值的类型和顺序必须与存储过程定义中的参数相匹配。
    • 如果存储过程没有定义参数,那么在调用时参数列表部分可以省略,但括号()仍然需要保留。

调用示例

假设我们有一个名为GetAllStudents的存储过程,它不接受任何参数,用于查询所有学生的信息。我们可以使用以下语句来调用它:

CALL GetAllStudents();

再假设我们有一个名为GetStudentByID的存储过程,它接受一个输入参数student_id,用于根据学号查询学生的信息。我们可以使用以下语句来调用它,并传递一个具体的学号值:

CALL GetStudentByID(1);

在这个例子中,1是传递给存储过程的参数值,表示我们要查询学号为1的学生的信息。

注意事项

  1. 存储过程与数据库关联

    • 存储过程是与特定数据库关联的。在调用存储过程时,需要确保当前连接的是正确的数据库,或者在使用存储过程名称时指定数据库名称(如果存储过程位于不同的数据库中)。
  2. 参数传递

    • 在调用带有参数的存储过程时,必须确保传递的参数数量、类型和顺序与存储过程定义中的参数相匹配。否则,MySQL将返回错误。
  3. 权限要求

    • 调用存储过程需要相应的权限。如果当前用户没有执行存储过程的权限,MySQL将拒绝调用请求。
  4. 错误处理

    • 在调用存储过程时,可能会遇到各种错误(如参数不匹配、存储过程不存在等)。因此,建议在调用存储过程时使用适当的错误处理机制来捕获和处理这些错误。

综上所述,存储过程的调用语法相对简单,但需要注意参数传递、权限要求和错误处理等方面的问题。通过正确地调用存储过程,可以高效地执行预定义的SQL语句集,从而提高数据库操作的效率和可维护性。

存储过程的强大功能

  1. 封装复杂逻辑:将复杂的SQL查询和业务逻辑封装在存储过程中,简化代码调用。
  2. 提高性能:存储过程在服务器端执行,减少了客户端和服务器之间的数据传输,提高了执行效率。
  3. 安全性:通过限制对存储过程的访问权限,可以提高数据库的安全性。
  4. 重用性:存储过程可以被多次调用,实现了代码的重用。

实战技巧

  1. 合理使用输入和输出参数:根据业务需求,合理设计输入和输出参数,提高存储过程的灵活性和可扩展性。
  2. 使用异常处理:在存储过程中添加异常处理逻辑,提高代码的健壮性和容错能力。
  3. 优化SQL语句:对存储过程中的SQL语句进行优化,提高执行效率。
  4. 注释和文档:为存储过程添加详细的注释和文档,方便他人理解和维护。

示例

以下是一个简单的存储过程示例,用于计算两个数的和:

DELIMITER //

CREATE PROCEDURE AddNumbers(IN num1 INT, IN num2 INT, OUT sum INT)
BEGIN
    SET sum = num1 + num2;
END //

DELIMITER ;

-- 调用存储过程
CALL AddNumbers(5, 10, @result);
SELECT @result;

在这个示例中,我们创建了一个名为AddNumbers的存储过程,它接受两个输入参数num1num2,并计算它们的和,通过输出参数sum返回结果。然后,我们调用这个存储过程,并使用变量@result来接收输出参数的值。

总结

存储过程是MySQL中一个非常强大的工具,它可以帮助我们封装复杂的SQL逻辑,提高代码的可读性和重用性。通过本文的介绍,相信你已经对存储过程有了更深入的了解,并掌握了其创建、调用和优化的基本方法。在未来的学习和工作中,不妨多尝试使用存储过程来优化你的数据库操作吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/896316.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何删除Maven

1.找到Maven安装路径 方法一: 可以直接在文件资源管理器里面选中“此电脑”然后右上角搜“apache-maven”,这个过程可能长达几分钟甚至更久 方法二: 这里推荐一个名叫“Everything”的软件,能够快速的查找到需要的文件 2.找到本…

Vue3中ref和reactive的对比

1. ref 定义 用途: 用于创建基本数据类型或单一值的响应式引用。语法: const myRef ref(initialValue); 特性 返回一个包含 .value 属性的 Proxy 对象。适用于基本数据类型(如数字、字符串、布尔值等)和单一值。 import { ref } from vue;const co…

C++学习笔记1——引用

引用变量是C新增的一种复合类型。 引用是已定义的变量的别名。如变量a为变量b的应用,则可以交替使用a或者b来表示该变量。引用变量主要用于函数的形参,此时函数使用的是该变量的原始数据而不是变量的副本。其作用有些类似于指针,但在类设计中…

pychar社区版下载

文章目录 第⼀步:下载社区版第二步:安装pycharm社区版第三步:创建项目 第⼀步:下载社区版 下载网址:https://www.jetbrains.com/pycharm/download/other.html 第二步:安装pycharm社区版 第三步&#xff1a…

从选题到致谢!50条经典ChatGPT学术指令1天完成1篇论文

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 还在为毕业论文头疼?今天给你分享50条神仙提示词,直接1天搞定整篇论文!从选题到致谢,全流程全覆盖。你可能不信,论文还能这么快写完?真…

云渲染与3D视觉效果如何影响珠宝行业!

3D渲染技术在珠宝行业的应用正迅速增长,2023年已带来数亿元收益,预计2024年将继续保持增长态势。珠宝品牌正越来越多地采用3D可视化技术来提升产品展示,以在激烈的市场竞争中占据优势。 云渲染技术不仅提升了渲染效率,还降低了成…

记一次有趣的发现-绕过堡垒机访问限制

前言 在某一次对设备运维管理的时候,发现的某安全大厂堡垒机设备存在绕过访问限制的问题,可以直接以低权限用户访问多个受控系统,此次发现是纯粹好奇心驱使下做的一个小测试压根没用任何工具。因为涉及到了很多设备和个人信息,所以…

项目实战:构建 effet.js 人脸识别交互系统的实战之路

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀构建 effet.js 📒1. 什么是effet.js📜2. 为什么需要使用effet.js📝3. effet.js的功能📚4. 使用…

【国产操作系统】揭秘deepin 23自定义、全盘、高级安装的奥秘,携手探索无限可能,尝鲜之旅,等你来驾驭!

简述 deepin 作为国内最好的个人桌面Linux社区发行版之一,其实受到很多人的关系,对于很多普通用户来说,其很易用,不需要怎么折腾,界面也非常友好。 针对技术型的 Linux 用户,可能对 deepin 的态度就是仁者…

文献分享: 高维ANN算法的综述

文章目录 0. \textbf{0. } 0. 写在前面 0.1. \textbf{0.1. } 0.1. 一些预备知识 0.2. \textbf{0.2. } 0.2. 本文的主要研究 0.3. \textbf{0.3. } 0.3. 本文一些研究限制 1. \textbf{1. } 1. 三大类 ANN \textbf{ANN} ANN算法回顾以及 DPG \textbf{DPG} DPG 1.1. \textbf{1.1. …

基于递推式最小二乘法的PMSM参数辨识MATLAB仿真模型

微❤关注“电气仔推送”获得资料(专享优惠) 模型简介 最小二乘法是一种回归估计法,适用于被辨识的参数与系统输出为线性关 系的情况。它是在一定数据量下,基于系统输出误差的平方和最小的准则对参 数进行辨识的方法。此模型通过…

案例分享-优秀蓝色系UI界面赏析

蓝色UI设计界面要提升舒适度,关键在于色彩搭配与对比度。选择柔和的蓝色调作为主色,搭配浅灰或白色作为辅助色,能营造清新、宁静的氛围。同时,确保文字与背景之间有足够的对比度,避免视觉疲劳,提升阅读体验…

CatVTON:AI 虚拟换装的卓越之选

在时尚与科技融合的时代,CatVTON 作为一款创新的 AI 虚拟换装工具,正引领着时尚界的变革。它由中山大学、美图、Pixocial 和鹏城实验室等机构联合开发,以其独特的优势和卓越的性能,为时尚爱好者、电商从业者以及设计师们带来了前所…

URL路径以及Tomcat本身引入的jar包会导致的 SpringMVC项目 404问题、Tomcat调试日志的开启及总结

一、URL路径导致的 SpringMVC项目 404问题 SpringMVC项目的各项代码都没有问题,但是在页面请求时仍然显示404,编译的时候报了下面的问题: org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录…

Windows下搭建VUE开发环境

Windows下搭建VUE开发环境 文章目录 Windows下搭建VUE开发环境第一步 安装nodejs下载nodejs安装nodejs配置环境变量安装测试配置npm的路径配置npm的国内代理安装必要工具测试工具安装的使用 第二步 安装vscode下载vscode安装插件Chinese (Simplified) (简体中文) Language Pack…

从0到1构建Next.Js项目SSG和SSR应用

最近在探索学习前端工程化相关内容,在如今前后端分离的架构下,为了提升首屏渲染速度和 SEO 效果,兜兜转转,又回到了服务端渲染。 本文主要是讲讲如何使用 Next.js 框架实现服务端渲染,重构或优化现有前端应用的 SEO 和…

光伏工程造价单自动生成

光伏工程造价单依据光伏设计图自动生成。 一、组件 类型:光伏组件是光伏电站的核心设备,负责将太阳能转化为电能。常见的类型包括单晶硅组件、多晶硅组件、薄膜组件等。 规格型号:具体规格型号取决于电站的设计需求,例如功率、…

企业博客SEO优化:8个必备工具与资源指南

在当今数字化时代,企业博客已远远超越了传统意义上的信息展示平台。它不仅是企业展示品牌形象、传递品牌价值的重要窗口,更是吸引潜在客户、增强用户粘性、提升网站流量和搜索引擎排名的关键。通过精心策划和高质量的内容创作,企业博客能够建…

【OpenGL】创建窗口/绘制图形

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、创建窗口 1、代码流程图 2、运行结果 3、代码 二、三角形 1、顶点缓冲对象&#xff1a;Vertex Buffer Object…

【Qt】控件——Qt控件的介绍、QWidget的介绍、QWidget的属性、QWidget的函数

文章目录 Qt1. 控件的概念2. QWidgetenabledgeometrywindowTitlewindowIconwindowOpacitycursorfonttoolTiptoolTipDuringstyleSheet Qt 1. 控件的概念 Widget 是 Qt 中的核心概念。英文原义是 “小部件”&#xff0c;我们此处也把它翻译为 “控件”。控件是构成一个图形化界面…