百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

系列 | 高性能存储-MySQL数据库之存储过程揭秘

mhr18 2024-09-29 13:35 22 浏览 0 评论

原文:http://www.enmotech.com/web/detail/1/727/1.html (复制链接,打开浏览器即可查看)

导读:本文介绍什么是存储过程?为什么要使用存储过程?如何使用存储过程?如何去使用存储过程以及怎么执行存储过程。

DBASK小程序已经开设“MySQL 数据库专栏”,欢迎大家关注!

系列存储集锦


  • 细致入微:Oracle中执行计划在Shared Pool中的存储位置探秘
  • 故障诊断 | 存储Cache丢失导致数据库无法open的案例分享
  • 【12.2新特性】在Oracle Active Data Guard上部署列式存储
  • DBA必备技能:RAC 如何安装新主机识别老存储恢复数据库
  • 守得云开见月明:一次ASM存储高可用故障解决过程分析
  • 基于超大规模集群的本地存储系统优化
  • 深入解析:DB2 V10.5新特性列式存储表的优点与缺点
  • WiredTiger存储引擎知多少?

(点击阅读原文,即可阅读以上文章)

什么是存储过程


迄今为止,使用的大多数SQL语句都是针对一个或多个表的单条语句。并非所有操作都这么简单,经常会有一个完整的操作需要多条语句才能完成。例如,考虑以下的情形。

1. 为了处理订单,需要核对以保证库存中有相应的物品。2. 如果库存有物品,这些物品需要预定以便不将它们再卖给别的人,并且要减少可用的物品数量以反映正确的库存量。3. 库存中没有的物品需要订购,这需要与供应商进行某种交互。4. 关于哪些物品入库(并且可以立即发货)和哪些物品退订,需要通知相应的客户。

这显然不是一个完整的例子,它甚至超出了本书中所用样例表的范围,但足以帮助表达我们的意思了。执行这个处理需要针对许多表的多条MySQL语句。此外,需要执行的具体语句及其次序也不是固定的,它们可能会(和将)根据哪些物品在库存中哪些不在而变化。

那么,怎样编写此代码?一种是我们可以单独编写每条语句,并根据结果有条件地执行另外的语句。在每次需要这个处理时(以及每个需要它的应用中)都必须做这些工作。而另一种可以创建存储过程。

其实简单来说:存储过程,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件,虽然它们的作用不仅限于批处理。

为什么要使用存储过程


既然我们知道了什么是存储过程,那么为什么要使用它们呢?有许多理由,下面列出一些主要的理由。

1. 通过把处理封装在容易使用的单元中,简化复杂的操作(正如前面例子所述)2. 由于不要求反复建立一系列处理步骤,这保证了数据的完整性。如果所有开发人员和应用程序都使用同一(试验和测试)存储过程,则所使用的代码都是相同的。这一点的延伸就是防止错误。需要执行的步骤越多,出错的可能性就越大。防止错误保证了数据的一致性。3. 简化对变动的管理。如果表名、列名或业务逻辑(或别的内容)有变化,只需要更改存储过程的代码。使用它的人员甚至不需要知道这些变化。这一点的延伸就是安全性。通过存储过程限制对基础数据的访问减少了数据讹误(无意识的或别的原因所导致的数据讹误)的机会。4. 提高性能。因为使用存储过程比使用单独的 SQL语句要快。5. 存在一些只能用在单个请求中的MySQL元素和特性,存储过程可以使用它们来编写功能更强更灵活的代码(在下一章的例子中可以看到。)

换句话说,使用存储过程有 3个主要的好处,即简单、安全、高性能。显然,它们都很重要。不过,在将 SQL代码转换为存储过程前,也必须知道它的一些缺陷。

1. 一般来说,存储过程的编写比基本 SQL语句复杂,编写存储过程需要更高的技能,更丰富的经验。2. 你可能没有创建存储过程的安全访问权限。许多数据库管理员限制存储过程的创建权限,允许用户使用存储过程,但不允许他们创建存储过程。

尽管有这些缺陷,存储过程还是非常有用的,并且应该尽可能地使用。

不能编写存储过程?你依然可以使用:MySQL将编写存储过程的安全和访问与执行存储过程的安全和访问区分开来。这是好事情。即使你不能(或不想)编写自己的存储过程,也仍然可以在适当的时候执行别的存储过程。

如何去使用存储过程


使用存储过程需要知道如何执行(运行)它们。存储过程的执行远比其定义更经常遇到,因此,我们将从执行存储过程开始介绍。然后再介绍创建和使用存储过程。

执行存储过程


MySQL称存储过程的执行为调用,因此MySQL执行存储过程的语句为CALL。 CALL接受存储过程的名字以及需要传递给它的任意参数。请看以下例子:

call productpricing ( @ pricelow, @ pricehigh, @ priceaverage );

其中执行productpricing的存储过程,他计算并返回产品的最低价格,最高价格,均价。存储过程可以显示结果,也可以不显示结果,接下来会提到。

创建存储过程


正如所述,编写存储过程并不是微不足道的事情。为让你了解这个过程,请看一个例子——一个返回产品平均价格的存储过程。以下是其代码:

CREATE PROCEDURE productpricing() BEGIN SELECT AVG(prod_price) AS priceaverage FROM products; END;

我们稍后介绍第一条和最后一条语句。此存储过程名为productpricing,用CREATE PROCEDURE productpricing() 语句定义。如果存储过程接受参数,它们将在 ()中列举出来。此存储过程没有参数,但后跟的 ()仍然需要。BEGIN和 END语句用来限定存储过程体,过程体本身仅是一个简单的 SELECT语句(使用第12章介绍的 Avg()函数)。

在MySQL处理这段代码时,它创建一个新的存储过程 productpricing。没有返回数据,因为这段代码并未调用存储过程,这里只是为以后使用而创建它。

这里有一个需要注意的就是:MySQL命令行客户机的分隔符

如果你使用的是MySQL命令行实用程序,应该仔细阅读此说明。

默认的 MySQL语句分隔符为;(正如你已经在迄今为止所使用的MySQL语句中所看到的那样)。MySQL命令行实用程序也使用;作为语句分隔符。如果命令行实用程序要解释存储过程自身内的 ;字符,则它们最终不会成为存储过程的成分,这会使存储过程中的 SQL出现句法错误。解决办法是临时更改命令行实用程序的语句分隔符,如下所示:

DELIMITER // CREATE PROCEDURE productpricing() BEGIN SELECT AVG(prod_price) AS priceaverage FROM products; END // DELIMITER ;

其中, DELIMITER //告诉命令行实用程序使用 //作为新的语句结束分隔符,可以看到标志存储过程结束的 END定义为END//而不是END; 。这样,存储过程体内的 ;仍然保持不动,并且正确地传递给数据库引擎。最后,为恢复为原来的语句分隔符,可使用 DELIMITER ;。除符号外,任何字符都可以用作语句分隔符。如果你使用的是 MySQL命令行实用程序,在阅读本文时请记住这里的内容。

那么,如何使用这个存储过程?如下所示:

CALL productpricing();

结果是:

+--------------+ | priceaverage | +--------------+ | 16.133571 | +--------------+

CALL productpricing();执行刚创建的存储过程并显示返回的结果。因为存储过程实际上是一种函数,所以存储过程名后需要有()符号(即使不传递参数也需要)。

出处:https://www.toutiao.com/a6600618790747111940/

想了解更多关于数据库、云技术吗?

快来关注”数据和云“公众号,”云和恩墨“官方网站,我们期待与大家一同学习和进步。

相关推荐

甲骨文签署多项大型云协议,其一未来可贡献超300亿美元年收入

IT之家7月1日消息,根据甲骨文Oracle当地时间6月30日向美国证券交易委员会(SEC)递交的FORM8-K文件,该企业在始于2025年6月1日的202...

甲骨文获TEMU巨额合同,后者大部分基础设施将迁移至Oracle云

IT之家6月23日消息,Oracle甲骨文创始人、董事长兼首席技术官LarryEllison(拉里埃里森)在本月早些时候的2025财年第四财季和全财年财报电话会议上表示,Oracle...

Spring Boot 自定义数据源设置,这些坑你踩过吗?

你在使用SpringBoot进行后端开发的过程中,是不是也遇到过这样的问题:项目上线后,数据库连接总是不稳定,偶尔还会出现数据读取缓慢的情况,严重影响了用户体验。经过排查,发现很大一部分原因竟然...

一个开箱即用的代码生成器(一个开箱即用的代码生成器是什么)

今天给大家推荐一个好用的代码生成器,名为renren-generator,该项目附带前端页面,可以很方便的选择我们所需要生成代码的表。首先我们通过git工具克隆下来代码(地址见文末),导入idea。...

低代码建模平台-数据挖掘平台(低代码平台的实现方式)

现在来看一下数据连接。·这里是管理数据连接的空间,点击这里可以新增一个数据连接。·输入连接名称,然后输入url,是通过gdbc的方式去连接的数据库,目前是支持mysql、oracle以及国产数据库达梦...

navicat 17.2.7连接oracle数据库提示加载oracle库失败

系统:macOS15.5navicat版本:navicatpremiumlite17.2.7连接oracle测试报错:加载oracle库失败【解决办法】:放达里面找到程序,显示简介里面勾选“使...

开源“Windows”ReactOS更新:支持全屏应用

IT之家6月17日消息,ReactOS团队昨日(6月16日)在X平台发布系列推文,公布了该系统的最新进展,包括升级Explorer组件,支持全屏应用,从Wine项目引入了...

SSL 推出采用全模拟内置混音技术的模拟调音台Oracle

英国调音台传奇品牌SolidStateLogic宣布推出Oracle——一款采用全模拟内置混音技术的调音台,在紧凑的AWS尺寸机箱内集成了大型调音台的功能。该调音台提供24输入和...

47道网络工程师常见面试题,看看有没有你不会的!

你们好,我的网工朋友。网络工程师面试的时候,都会被问到什么?这个问题其实很泛,一般来说,你肯定要先看明白岗位需求写的是什么。基本上都是围绕公司需要的业务去问的。但不可否认的是,那些最基础的概念,多少也...

汉得信息:发布EBS系统安装启用JWS的高效解决方案

e公司讯,从汉得信息获悉,近日,微软官方宣布InternetExplorer桌面应用程序将于2022年6月15日正式停用。目前大部分客户都是使用IE浏览器打开EBS的Form界面,IE停用后,只能使...

36.9K star ! 推荐一个酷炫低代码开发平台!功能太强!

前言最近在逛github,看看能不能搜罗到一些对自己有帮助的开源软件。不经意间看到一个高star的java开源项目:jeecg-boot。进入在线演示版一看,感叹实在是太牛了!此开源项目不管是给来学习...

Linux新手入门系列:Linux下jdk安装配置

本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...

手把手教你在嵌入式设备中使用SQLite3

摘要:数据库是用来存储和管理数据的专用软件,使得管理数据更加安全,方便和高效。数据库对数据的管理的基本单位是表(table),在嵌入式linux中有时候它也需要用到数据库,听起来好难,其实就是几个函数...

JAVA语言基础(java语言基础知识)

一、计算机的基本概念什么是计算机?计算机(Computer)全称:电子计算机,俗称电脑。是一种能够按照程序运行、自动高速处理海量数据的现代化智能电子设备。由硬件和软件组成、没有安装过任何软件的计算机称...

再见 Navicat!一款开源的 Web 数据库管理工具!

大家好,我是Java陈序员。在日常的开发工作中,常常需要与各种数据库打交道。而为了提高工作效率,常常会使用一些可视化工具进行操作数据库。今天,给大家介绍一款开源的数据库管理工具,无需下载安装软件,基...

取消回复欢迎 发表评论: