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

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/

编辑:尹文敏

资源下载

关注公众号:数据和云(OraNews)回复关键字获取

2018DTCC , 数据库大会PPT

2018DTC,2018 DTC 大会 PPT

ENMOBK,《Oracle性能优化与诊断案例》

DBALIFE ,“DBA 的一天”海报

DBA04 ,DBA 手记4 电子书

122ARCH ,Oracle 12.2体系结构图

2018OOW ,Oracle OpenWorld 资料

产品推荐

云和恩墨Bethune Pro2 企业版,集监控、巡检、安全于一身,你的专属数据库实时监控和智能巡检平台,漂亮的不像实力派,你值得拥有!

云和恩墨zData一体机现已发布超融合版本和精简版,支持各种简化场景部署,零数据丢失备份一体机ZDBM也已发布,欢迎关注。

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

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

  1. Java系列技术之MySql数据库-钟洪发-专题视频课程

    Java系列技术之MySql数据库-66人已学习 课程介绍         在Java系列的技术体系中,数据库是必不可少的核心知识,任何稍稍复杂一点的应用系统,都不可能少的了数据库的支持,将MySQL ...

  2. 测试环境搭建mysql数据库_软件测试环境的搭建系列:[2] MySQL数据库的安装

    原标题:软件测试环境的搭建系列:[2] MySQL数据库的安装 本文介绍CentOS系统上用源码包方式安装MySQL的方法,源码安装方式是需要自己到网上下载源码包,然后解压安装,此方式可以指定配置参数 ...

  3. 石正喜MySQL数据库使用教程_《21世纪高职高专系列规划教材:MySQL数据库实用教程》【摘要 书评 在线阅读】-苏宁易购图书...

    商品参数 作者: 石正喜编 出版社:北京师范大学出版社 出版时间:2014-01-01 00:00:00 版次:1 印次:1 印刷时间:2014-01-01 字数:400000 页数:298 开本:1 ...

  4. java JDBC连接MySQL数据库调用存储过程进行查询

    java JDBC连接MySQL数据库调用存储过程进行查询 主程序代码 工具类 文件信息 存储过程 结果截图 主程序代码 package Mysql;import util.JDBCUtils; im ...

  5. cakephp mysql_攻克CakePHP系列一 连接MySQL数据库

    接下来将一步一步对这个框架进行说明. 首先是下载框架 官方主页:http://cakephp.org/ 下载地址:http://cakeforge.org/frs/?group_id=23&r ...

  6. mysql数据库加密存储过程_数据库系统(六)---MySQL语句及存储过程

    1.存储过程是一组为了完成某项特定功能的 SQL 语句集,其实质上就是一段存储在数据库中的代码,它可以由声明式的 SQL 语句(如 CREATE.UPDATE 和SELECT 等语句)和过程式 SQL ...

  7. MySql数据库学习--存储过程(1)

    在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用户入门. 存储过程介绍 存储过程是一组为了 ...

  8. MySQL数据库:存储过程Procedure

    一.存储过程: SQL语句需要先编译然后执行,而存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用它. 存储过程 ...

  9. mysql数据库的存储过程不用学吗,MySql数据库之存储过程学习_MySQL

    之前在工作中总是听别人提到存储过程,觉得是个很高深的东西,利用工作之余,看了下相关的知识,现将学习知识总结如下,希望可以为刚学习的人提供些许帮助. 开发环境:Navicat For Mysql. My ...

最新文章

  1. java和python哪个好就业2020-Python和JAVA的就业前景哪个好点?
  2. C# ThreadPool类(线程池)
  3. webview键盘自适应_黑爵毛茸茸机械键盘:感受来自治愈系的暖萌
  4. vscode html 格式化_详解VSCode 格式化不符合预期的问题
  5. 5.1.2全景声音箱摆位_全景声音响系统音箱应该如何摆位(5.1.2、5.1.4篇)
  6. 因下面文的损坏或丢失windows/system32/config/system 解决方法
  7. SpringBoot 学习二:操作数据库
  8. 数据结构(C语言版)严蔚敏李冬梅(第2版)课后习题答案
  9. 如何用猿大师播放器把海康威视硬盘录像机截取MP4视频在web页面上回放?支持本地和远程视频吗?
  10. 项目管理(PMP)认证介绍
  11. 各种软件以及插件官网地址 echarts Vscode 阿里云图标库 鼠标图标
  12. 怎么修改电脑的ip地址
  13. 【山科OJ】Problem C: Matrix Problem (III) : Array Practice
  14. 一名【合格】前端工程师的自检清单
  15. 黑客长期摇号不中黑掉北京小客车摇号网
  16. 趣图 | 早起的你 vs 熬夜的你
  17. 正则表达式必看书籍推荐
  18. 福昕高级PDF编辑器Foxit PhantomPDF Business v9.3.0.10826企业版+破解补丁
  19. java加载字体文件_Java的加载自定义字体文件(.TTF)
  20. 如何用python实现地图定位_GPS 测试汇总和python GPS 导航地图实现

热门文章

  1. zuul 自定义策略_如何为您的社区定义指标策略
  2. 开源压缩算法brotli_Brotli:一种新的压缩算法,可加快互联网速度
  3. linux 穿件文件_关于Linux的25件事
  4. linux 开源谷歌浏览器_开发人员浏览器,Google开源版本等
  5. C++ 数据抽象 封装 接口
  6. es6 作为对象属性的Generator函数
  7. es6 __proto__属性,Object.setPrototypeOf(),Object.getPrototypeOf()
  8. mybatis plus 格式话_作为阿里的面试官,我有话想说
  9. python字符串的内建函数_Python 的字符串内建函数
  10. mysql case默认_MySQL知识整理10.1—存储过程和函数