数据库入门:MySQL必知必会(二十三)使用存储过程

二十三、使用存储过程

    • 01. 存储过程
    • 02. 为什么要使用存储过程
    • 03. 使用存储过程
    • 04. 下一篇:[使用游标](https://blog.csdn.net/qq_34114121/article/details/90950650)

01. 存储过程

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

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

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

02. 为什么要使用存储过程

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

  1. 通过把处理 封装 在容易使用的单元中,简化复杂的操作
  2. 由于不要求反复建立一系列处理步骤,这 保证了数据的完整性

这一点的延伸就是防止错误,需要执行的步骤越多,出错的可能性就越大,防止错误保证了数据的一致性

  1. 简化对变动的管理: 如果表名、列名或业务逻辑(或别的内容)有变化,只需要更改存储过程的代码,使用它的人员甚至不需要知道这些变化;

这一点的延伸就是安全性,通过存储过程限制对基础数据的访问减少了数据 讹误 (无意识的或别的原因所导致的数据讹误)的机会;

  1. 提高性能: 因为使用存储过程比使用单独的SQL语句要快;
  2. 存在一些只能用在单个请求中的MySQL元素和特性,存储过程可以使用它们来编写功能更强更灵活的代码;

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

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

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

03. 使用存储过程

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

  1. 执行存储过程:
    1.1 MySQL称存储过程的执行为调用,因此MySQL执行存储过程的语句为CALL:
    CALL
    1.2 执行名为productpricing的存储过程,它计算并返回产品的最低、最高和平均价格;
  2. 创建存储过程:
    2.1 返回产品平均价格的存储过程:
    数据库入门:MySQL必知必会(二十三)使用存储过程_第1张图片
    2.2 此存储过程名为productpricing,用 CREATE PROCEDURE productpricing() 语句定义;
    2.3 如果存储过程接受参数,它们将在 () 中列举出来;
    2.4 使用这个存储过程:
    数据库入门:MySQL必知必会(二十三)使用存储过程_第2张图片
  3. 删除存储过程:
    3.1 存储过程在创建之后,被保存在服务器上以供使用,直至被删除;
    3.2 删除刚创建的存储过程:
    DROP
    3.3 当过程存在想删除它时(如果过程不存在也不产生错误),可使用DROP PROCEDURE IF EXISTS
  4. 使用参数:
    4.1 productpricing只是一个简单的存储过程,它简单地显示SELECT语句的结果,一般,存储过程并不显示结果,而是把结果返回给你指定的变量
    4.2 变量(variable): 内存中一个特定的位置,用来临时存储数据;
    4.3 productpricing的修改版本:
    数据库入门:MySQL必知必会(二十三)使用存储过程_第3张图片
    4.4 此存储过程接受3个参数:pl存储产品最低价格,ph存储产品最高价格,pa存储产品平均价格
    4.5 关键字OUT指出相应的参数用来从存储过程传出一个值(返回给调用者);
    4.6 调用此修改过的存储过程,必须指定3个变量名:
    CALL
    4.7 在调用时,这条语句并不显示任何数据,它返回以后可以显示(或在其他处理中使用)的变量:
    数据库入门:MySQL必知必会(二十三)使用存储过程_第4张图片
    数据库入门:MySQL必知必会(二十三)使用存储过程_第5张图片
    4.8 这次使用IN和OUT参数,ordertotal接受订单号并返回该订单的合计:
    数据库入门:MySQL必知必会(二十三)使用存储过程_第6张图片
    输入
    onumber定义为IN,订单号被传入存储过程ototal定义为OUT,从存储过程返回合计
    调用这个新存储过程:
    调用
    显示此合计:
    数据库入门:MySQL必知必会(二十三)使用存储过程_第7张图片
    4.9 建立智能存储过程:
    迄今为止使用的所有存储过程基本上都是封装MySQL简单的SELECT语句,虽然它们全都是有效的存储过程例子,但它们所能完成的工作你直接用这些被封装的语句就能完成(如果说它们还能带来更多的东西,那就是使事情更复杂);只有在存储过程内包含业务规则和智能处理时,它们的威力才真正显现出来。
    考虑这个场景。你需要获得与以前一样的订单合计,但需要对合计增加营业税,不过只针对某些顾客(或许是你所在州中那些顾客)。那么,你需要做下面几件事情:
    获得合计;
    把营业税有条件地添加到合计;
    返回合计
    数据库入门:MySQL必知必会(二十三)使用存储过程_第8张图片
    数据库入门:MySQL必知必会(二十三)使用存储过程_第9张图片
    此存储过程有很大的变动。首先,增加了注释(前面放置-- ),在存储过程复杂性增加时,这样做特别重要。添加了另外一个参数taxable,它是一个布尔值(如果要增加税则为真,否则为假)。在存储过程体中,用DECLARE语句定义了两个局部变量。DECLARE要求指定变量名和数据类型,它也支持可选的默认值(这个例子中的taxrate的默认被设置为6%)。SELECT语句已经改变,因此其结果存储到total(局部变量)而不是ototal。IF语句检查taxable是否为真,如果为真,则用另一SELECT语句增加营业税到局部变量total。最后,用另一SELECT语句将total(它增加或许不增加营业税)保存到ototal。
    数据库入门:MySQL必知必会(二十三)使用存储过程_第10张图片
    4.10 检查存储过程:
    显示用来创建一个存储过程的CREATE语句
    输入
    为了获得包括何时、由谁创建等详细信息的存储过程列表,使用SHOW PROCEDURE STATUS

04. 下一篇:使用游标

你可能感兴趣的:(MySQL数据库,MySQL数据库学习,使用存储过程)