mysql数据库中使用存储过程带来的好处和示例(存储过程的概念、定义、作用等详解)

目录

一、概述

二、存储过程的作用

1、代码重用

2、简化复杂操作

3、提高性能

4、安全性和数据完整性

三、相对于sql操纵语句(select、insert等)存储过程的好处

1、代码重用和封装

(1)概述

(2)举例

2. 简化应用程序逻辑

(1)概述

(2)举例

3. 提高性能

4. 安全性

(1)概述

(2)举例

5. 事务处理

(1)概述

(2)举例

6. 集中管理和维护

7. 版本控制

8. 增强可读性

9. 日志和审计

10. 支持复杂的业务逻辑

四、存储过程实战

 1. 存储过程的实战环境

(1)命令行模式

(2)navicat工具

 2. 创建存储过程

 3. 调用存储过程

 4. 参数

 5. 错误处理

 6. 修改和删除存储过程

 7. 注意事项

五、SQL中的存储过程和编程语言中的函数

1、概述

2、相似点

3、差异


一、概述

        MySQL的存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集合。用户通过指定的存储过程名和参数(如果有的话)来调用并执行它。存储过程可以在数据库中预编译并存储,这样它们可以被多次调用而无需重新编写或解析SQL语句。

        可以用如下图表示存储过程:

二、存储过程的作用

1、代码重用

        存储过程允许编写一次代码并在多个地方重用它。

2、简化复杂操作

        对于复杂的数据库操作,可以将其封装在存储过程中,从而简化应用程序代码。

3、提高性能

        存储过程在第一次执行时会被编译并存储在数据库中,后续调用时无需再次编译,从而提高性能。

4、安全性和数据完整性

        通过限制对基础表的直接访问,可以只通过存储过程来访问数据,从而确保数据的安全性和完整性。

三、相对于sql操纵语句(select、insert等)存储过程的好处

        在MySQL中使用存储过程(Stored Procedures)相比直接使用SQL基本操作语句(如SELECT, INSERT, UPDATE等)来处理数据表,具有以下好处:

1、代码重用和封装

(1)概述

   - 存储过程允许将复杂的SQL逻辑封装在一个可重用的单元中。这样,可以多次调用这个存储过程,而不需要重复编写相同的SQL代码。

   - 通过封装,可以隐藏复杂的SQL逻辑,只向用户或应用程序提供简单的接口。

(2)举例

        假设有一个复杂的查询,用于计算员工的总工资(包括基本工资、奖金、津贴等)。可以将这个查询封装成一个存储过程:

DELIMITER //  
CREATE PROCEDURE CalculateEmployeeTotalSalary(IN emp_id INT, OUT total_salary DECIMAL(10, 2))  
BEGIN  SELECT   SUM(salary.amount + bonus.amount + allowance.amount)   INTO   total_salary  FROM   employees e  JOIN   salaries salary ON e.id = salary.employee_id  LEFT JOIN   bonuses bonus ON e.id = bonus.employee_id  LEFT JOIN   allowances allowance ON e.id = allowance.employee_id  WHERE   e.id = emp_id;  
END //  
DELIMITER ;

        这个存储过程可以被多次调用,传入不同的员工ID,并返回他们的总工资。

2. 简化应用程序逻辑

(1)概述

   - 应用程序可以通过调用存储过程来执行复杂的数据库操作,而不需要在应用程序代码中编写大量的SQL语句。这有助于简化应用程序的逻辑,并使其更易于维护。

(2)举例

        在应用程序中,可能需要经常获取员工的总工资。通过使用上面的存储过程,可以简化应用程序中的逻辑:

# 伪源代码  
employee_id = 123  
total_salary = call_stored_procedure('CalculateEmployeeTotalSalary', employee_id)  
print(f"Employee's total salary is: {total_salary}")

3. 提高性能

   - 存储过程在首次执行时会被编译并存储在数据库中,因此后续调用时不需要再次编译,从而提高了执行速度。

   - 存储过程可以优化查询计划,因为MySQL优化器在存储过程创建时会为其生成一个执行计划,并在后续调用时重复使用。

4. 安全性

(1)概述

   - 存储过程允许限制对基础数据表的直接访问,从而提高了数据的安全性。可以通过存储过程来验证和过滤用户输入,防止SQL注入等安全漏洞。

   - 可以使用MySQL的权限系统来限制对存储过程的访问,只允许特定的用户或角色执行特定的存储过程。

(2)举例

        可以通过存储过程来验证和过滤用户输入,防止SQL注入。例如,可以创建一个存储过程来插入新用户,并在过程中验证用户名和密码的格式:

DELIMITER //  
CREATE PROCEDURE InsertNewUser(IN username VARCHAR(50), IN password VARCHAR(50))  
BEGIN  -- 验证用户名和密码的格式(例如,确保密码足够长或包含特定字符)  IF LENGTH(password) < 8 THEN  SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Password must be at least 8 characters long';  END IF;  INSERT INTO users (username, password_hash) VALUES (username, SHA2(password, 256));  
END //  
DELIMITER ;

5. 事务处理

(1)概述

        存储过程可以包含多个SQL语句,并且这些语句可以作为一个事务来执行。这意味着要么所有语句都成功执行,要么在发生错误时回滚到事务开始之前的状态。这有助于确保数据的完整性和一致性。

(2)举例

        假设需要在一个存储过程中同时插入一条订单记录和多个订单项记录,并且希望它们要么都成功,要么都失败(回滚):

DELIMITER //  
CREATE PROCEDURE InsertOrderWithItems(IN order_data ..., IN item_data_list ...)  
BEGIN  DECLARE EXIT HANDLER FOR SQLEXCEPTION   BEGIN  -- 发生异常时回滚事务  ROLLBACK;  RESIGNAL;  END;  START TRANSACTION;  -- 插入订单记录  INSERT INTO orders ...;  -- 插入订单项记录(循环遍历item_data_list)  -- ...  COMMIT;  
END //  
DELIMITER ;

6. 集中管理和维护

        存储过程都存储在数据库中,可以通过数据库管理工具进行集中管理和维护。可以轻松地查看、修改或删除存储过程,而不需要在多个应用程序文件中搜索和修改SQL代码。

7. 版本控制

        由于存储过程存储在数据库中,可以使用数据库的版本控制系统(如MySQL的备份和恢复功能)来跟踪和管理存储过程的更改。这有助于确保在数据库升级或迁移时不会丢失或破坏重要的业务逻辑。

8. 增强可读性

        通过为复杂的SQL逻辑命名并提供描述性的参数,存储过程可以增强代码的可读性。这使得其他开发人员更容易理解代码意图和目的。

9. 日志和审计

        存储过程的执行可以被记录在日志中,以便于后续的审计和跟踪。这有助于在出现问题时快速定位原因,并采取相应的措施进行修复。

10. 支持复杂的业务逻辑

        存储过程支持条件语句、循环结构等控制流语句,可以处理复杂的业务逻辑。这可以将复杂的业务规则封装在存储过程中,并通过简单的接口调用它们。

四、存储过程实战

 1. 存储过程的实战环境

(1)命令行模式

        在安装好mysql的linux或window计算机,启动mysql,输入root账号和密码,就可以进入命令行模式。

(2)navicat工具

  • 打开 Navicat 并连接到 MySQL 数据库。
  • 在左侧的数据库列表中,找到想要操作的数据库,并双击它。
  • 在打开的界面中,找到“函数”或“存储过程”部分(这取决于 Navicat 的版本和设置),右键点击它,选择“新建函数”或“新建存储过程”。
  • 在打开的 SQL 编辑器中,输入存储过程定义,如上面的例子所示。
  • 点击执行按钮(通常是一个绿色的三角形图标)来创建存储过程。

 2. 创建存储过程

        使用CREATE PROCEDURE语句来创建存储过程。以下是一个简单的示例:

DELIMITER //  
CREATE PROCEDURE SimpleProcedure()  
BEGIN  SELECT 'Hello, World!';  
END //  
DELIMITER ;

        DELIMITER用于更改命令提示符,以便在存储过程中使用多个语句。在上述示例中,我们将分隔符更改为//,以便在存储过程中使用多个语句,并在存储过程定义结束后将其恢复为;。

         CREATE PROCEDURE后面是存储过程的名称和参数列表(如果有的话)。 

         BEGIN和END之间的部分是存储过程的主体,其中包含了要执行的SQL语句。

 3. 调用存储过程

        使用CALL语句来调用存储过程。例如,要调用上面创建的SimpleProcedure,可以这样做:

        CALL SimpleProcedure();

 4. 参数

        存储过程可以接受参数,这些参数可以是输入参数(IN)、输出参数(OUT)或输入/输出参数(INOUT)。以下是一个带有输入参数的存储过程示例:

DELIMITER //  
CREATE PROCEDURE GreetUser(IN userName VARCHAR(50))  
BEGIN  SELECT CONCAT('Hello, ', userName, '!');  
END //  
DELIMITER ;

        调用这个存储过程时,需要提供一个参数值:

                CALL GreetUser('John Doe');

 5. 错误处理

        在存储过程中,可以使用DECLARE语句来声明条件处理程序,以便在发生错误时执行特定的操作。例如,可以使用DECLARE CONTINUE HANDLER来定义一个在发生错误时继续执行的错误处理程序。

 6. 修改和删除存储过程

         使用ALTER PROCEDURE语句可以修改存储过程。但是,请注意,直接修改存储过程可能不是一个好主意,因为这可能会导致意外的副作用。通常,更好的做法是先删除旧的存储过程,然后创建一个新的。

     使用DROP PROCEDURE语句可以删除存储过程。例如,要删除上面创建的SimpleProcedure,可以这样输入如下命令:

        DROP PROCEDURE SimpleProcedure;

 7. 注意事项

         在编写存储过程时,要确保不会与现有的SQL语句或函数名称冲突。

         在存储过程中使用变量时,要确保正确地声明和初始化。

         始终测试存储过程以确保按预期工作,并处理所有可能的错误情况。

五、SQL中的存储过程和编程语言中的函数

1、概述

        MySQL中的存储过程(Stored Procedure)与许多编程语言中的函数(Function)在概念上有很多相似之处。虽然它们在具体实现和使用细节上可能有所不同,但它们的基本原理和目标是一致的:封装一段可重用的代码逻辑,并通过特定的名称和参数(如果有的话)来调用这段逻辑。

2、相似点

        以下是MySQL存储过程和编程语言函数之间的一些相似之处:

(1)封装代码逻辑:存储过程和函数都允许将复杂的逻辑封装在一个可重用的单元中。这样,可以在其他地方多次调用这个单元,而不需要重复编写相同的代码。

(2)接受参数:存储过程和函数都可以接受参数,这些参数可以是输入参数(用于传递数据给存储过程或函数),也可以是输出参数(用于从存储过程或函数返回值)。

(3)返回值:虽然存储过程通常不直接返回值(但可以通过输出参数或结果集来传递数据),但函数通常有一个返回值,该值表示函数执行的结果。

(4)可调用:存储过程和函数都可以从应用程序或其他数据库对象中调用。可以通过指定的名称和参数(如果有的话)来调用它们。

(5)可维护性:由于存储过程和函数封装了复杂的逻辑,因此它们可以提高代码的可维护性。当需要修改逻辑时,只需要修改存储过程或函数的定义,而不需要修改所有调用该逻辑的地方。

3、差异

        MySQL的存储过程和编程语言中的函数也有一些不同之处:

(1)返回类型:存储过程通常不直接返回一个值(尽管它们可以通过输出参数或结果集来传递数据),而函数通常有一个明确的返回类型,并返回一个值。

(2)调用方式:在MySQL中,使用CALL语句来调用存储过程,而函数可以在SQL查询中直接作为表达式使用。

(3)错误处理:存储过程通常包含更复杂的错误处理逻辑,因为它们可能执行多个操作并需要确保数据的一致性和完整性。而函数通常只关注单个操作的结果。

(4)存储位置:存储过程和函数都存储在数据库中,但它们在数据库中的表示方式和管理方式可能有所不同。

        总的来说,MySQL的存储过程和编程语言中的函数在概念和用法上有所不同,但它们的原理和目标是一致的:封装可重用的代码逻辑并提高代码的可维护性和可重用性。


文章正下方可以看到我的联系方式:鼠标“点击” 下面的 “威迪斯特-就是video system 微信名片”字样,就会出现我的二维码,欢迎沟通探讨。


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红酒舞动,运动风采,品味力与美

当夜幕降临&#xff0c;城市的灯火渐次亮起&#xff0c;忙碌了一天的人们开始寻找那份属于自己的宁静与愉悦。在这个时刻&#xff0c;红酒与运动&#xff0c;这两个看似截然不同的元素&#xff0c;却能以它们不同的魅力&#xff0c;为我们带来一场视觉与感官的盛宴。 红酒&…

多供应商食品零售商城系统的会员营销设计和实现

在多供应商食品零售商城系统中&#xff0c;会员营销是提升用户粘性和增加销售的重要手段。一个有效的会员营销系统能够帮助平台更好地了解用户需求&#xff0c;提供个性化服务&#xff0c;进而提高用户满意度和忠诚度。本文将详细探讨多供应商食品零售商城系统的会员营销设计与…

四川赤橙宏海商务信息咨询有限公司一站式抖音电商服务

在数字化浪潮汹涌的当下&#xff0c;电商行业正以前所未有的速度发展&#xff0c;而抖音电商作为其中的佼佼者&#xff0c;更是吸引了无数商家和消费者的目光。在这个充满机遇与挑战的市场中&#xff0c;四川赤橙宏海商务信息咨询有限公司凭借其专业的服务和丰富的经验&#xf…

免费资源推荐丨维普OA期刊服务:OA传播 可在线阅读,可下载PDF

《OA传播(Communication based on Open Access,CBOA)》数据库 产品介绍 OA传播(Communication based on Open Access,CBOA)由重庆非晓数据科技有限公司(重庆维普资讯有限公司子公司)出品&#xff0c;是以服务全球科学研究与技术创新为宗旨的OA学术文献一站式免费检索、下载、传…

背包模型——AcWing 423. 采药

背包模型 定义 背包模型是一种常见的算法问题模型&#xff0c;它主要涉及将一些物品放入一个容量有限的背包中&#xff0c;以达到某种最优目标&#xff0c;如最大化价值或最小化重量等。 运用情况 常用于资源分配、项目选择、货物装载等实际问题中。例如&#xff0c;在选择…

深圳比创达EMC|EMC与EMI滤波器:在电子设备中的平衡之道

随着科技的快速发展&#xff0c;电子设备已经深入到我们生活的方方面面&#xff0c;从家用电器到工业设备&#xff0c;从通信设备到医疗仪器&#xff0c;都离不开电子技术的支持。然而&#xff0c;电子设备在带来便利的同时&#xff0c;也面临着电磁兼容&#xff08;EMC&#x…

照片变漫画怎么弄?这5个照片变漫画方法超简单

在艺术和社交融合的现在&#xff0c;将照片转换为漫画风格已经成为一种流行趋势。 无论是为了创造个性化的头像&#xff0c;还是制作有趣的社交媒体帖子&#xff0c;拥有一款能够将照片转换为漫画的软件将极大地丰富你的创意表达。 下面&#xff0c;本文将介绍几款能够实现这…

【浦语开源】深入探索:大模型全链路开源组件 InternLM Lagent,打造灵笔Demo实战指南

一、准备工作&#xff1a; 1、环境配置&#xff1a; pip、conda换源&#xff1a; pip临时换源&#xff1a; pip install -i https://mirrors.cernet.edu.cn/pypi/web/simple some-package# 这里的“https://mirrors.cernet.edu.cn/pypi/web/simple”是所换的源&#xff0c;…

TDengine 推出新连接器,与 Wonderware Historian 无缝连接

在最新发布的TDengine 3.2.3.0 版本中&#xff0c;我们进一步更新了 TDengine 的数据接入功能&#xff0c;推出了一款新的连接器&#xff0c;旨在实现 Wonderware Historian&#xff08;现称为 AVEVA Historian&#xff09;与 TDengine 的集成。这一更新提供了更加便捷和高效的…

什么是钢直尺“光学影像式”仪器校准方法?

计量和我们生活密不可分&#xff0c;但是对于计量的了解大多数人并不深入&#xff0c;因此也会存在一些认知上的误差。比如一个体温计买来才几十块&#xff0c;但是做一次校准费用就是一两百。又或者是一把钢直尺才十几块成本&#xff0c;校准的费用却是成本的三到四倍。 不了…

选择诊所管理系统的原则是什么?

如今&#xff0c;诊所管理系统已成为医疗机构提升管理效率、优化患者服务的重要工具。然而&#xff0c;市场上的诊所管理系统琳琅满目&#xff0c;功能各异&#xff0c;因此&#xff0c;如何选择一款适合自己诊所的管理系统&#xff0c;是许多诊所管理者需要思考的问题。下面&a…

SpringBoot-在配置文件中使用Profile

Profile&#xff0c;译为“配置文件” 在这里的Spring Boot也是一样&#xff0c;我们可以配置很多个Profile&#xff0c;每个Profile都对应一整个完整的全局配置&#xff0c;激活哪个&#xff0c;那个对应的全局配置就生效&#xff0c;具体的配置&#xff1a; 1、properties格…

[leetcode]number-of-longest-increasing-subsequence

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int findNumberOfLIS(vector<int> &nums) {int n nums.size(), maxLen 0, ans 0;vector<int> dp(n), cnt(n);for (int i 0; i < n; i) {dp[i] 1;cnt[i] 1;for (int j 0; j < i…

操作系统入门 -- 内存管理

操作系统入门 – 内存管理 1.内存种类 1.1 虚拟内存&#xff08;VIRT&#xff09; 进程需要的虚拟内存大小&#xff0c;包括进程使用的库、代码、数据以及malloc、new分配的堆空间和栈空间等。若进程申请了10MB内存但实际使用了1MB&#xff0c;则物理空间会增长10MB。 1.2 …

【MySQL连接器(Python)指南】06-连接器连接参数

文章目录 前言连接器连接参数总结前言 MySQL连接器(Python),用于让Python程序能够访问MySQL数据库。要想让Python应用程序正确高效地使用MySQL数据,就需要深入了解MySQL连接器的特性和使用方法。 上篇文章👉《【MySQL连接器(Python)指南】05-通过连接器操作MySQL数据库》 …

LKD-Net: Large Kernel Convolution Network for Single Image Dehazing

LKD-Net&#xff1a;用于单幅图像去噪的大型核卷积网络 摘要 基于深度卷积神经网络(CNN)的单幅图像去噪方法已经取得了很大的成功。以往的方法致力于通过增加网络的深度和宽度来提高网络的性能。目前的方法侧重于增加卷积核的大小&#xff0c;以受益于更大的接受野来增强其性能…

【C++】关于虚函数的理解

深入探索C虚函数&#xff1a;原理、应用与实例分析 一、虚函数的原理二、虚函数的应用三、代码实例分析四、总结 在C面向对象编程的世界里&#xff0c;虚函数&#xff08;Virtual Function&#xff09;扮演着至关重要的角色。它不仅实现了多态性这一核心特性&#xff0c;还使得…

我用过最好的GPT,NewspaceGPT使用心得

记住网址&#xff1a;https://newspace.ai0.cn 前言 只要你能表达明白&#xff0c;NewspaceGPT就不会让你失望。 Gpt4o预测GPT5 IT之家6月22日消息&#xff0c;在美国达特茅斯工程学院周四公布的采访中&#xff0c;OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布&…

VMware Workstation搭建Windows Server2019主备AD域控详细操作步骤

版本 虚拟机版本 VMware Workstation 16 Prp 16.2.5 build-20904516 服务器系统版本 具体操作 安装第一台虚拟机服务器 首先先创建一台Windows Server2019虚拟机&#xff0c;可以参考VMware Workstation安装Windows Server2019系统详细操作步骤-CSDN博客 克隆第一台虚拟机…

VMware Workstation环境下,FTP服务的安装配置,用MX Linux来测试

需求说明: 某企业信息中心计划使用IP地址17216.11.0用于虚拟网络测试,注册域名为xyz.net.cn.并将172.16.11.2作为主域名的服务器(DNS服务器)的IP地址,将172.16.11.3分配给虚拟网络测试的DHCP服务器,将172.16.11.4分配给虚拟网络测试的web服务器,将172.16.11.5分配给FTP服务器…