【MySQL必知必会】学习笔记Day12

【MySQL必知必会】学习笔记Day12&3.1&D23章&P163-173页

21、使用存储过程

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

(2)为什么要使用存储过程

  • 使用存储过程有3个主要的好处,即简单、安全、高性能

  • 通过把处理封装在容易使用的单元中,简化复杂的操作(正如前 面例子所述)。

  • 由于不要求反复建立一系列处理步骤,这保证了数据的完整性。 如果所有开发人员和应用程序都使用同一(试验和测试)存储过 程,则所使用的代码都是相同的。 这一点的延伸就是防止错误。需要执行的步骤越多,出错的可能 性就越大。防止错误保证了数据的一致性。

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

  • 提高性能。因为使用存储过程比使用单独的SQL语句要快。

  • 存在一些只能用在单个请求中的MySQL元素和特性,存储过程可 以使用它们来编写功能更强更灵活的代码

(3)使用存储过程

① 执行存储过程

  • eg:执行名为productpricing的存储过程,它计算并返回产 品的最低、最高和平均价格。
    存储过程可以显示结果,也可以不显示结果,如稍后所述。
CALL productpricing(@pricelow,
                    @pricehigh,
                    @priceaverage);

② 创建存储过程

  • eg:返回产品平均价格
CALL PROCEDURE productpricing()
BEGIN
   SELECT Avg(prod_price) AS priceaverage
   FROM products;
END;

BEGIN和END语句用来限定存储过程体

  • 使用上面的存储过程
CALL  productpricing()

③ 删除存储过程

CALL PROCEDURE productpricing

注:仅当存在时删除:如果指定的过程不存在,则DROPPROCEDURE将产生一个错误。当过程存在想删除它时(如果过程不存在也 不产生错误)可使用DROP PROCEDURE IF EXISTS

④ 使用参数

CREATE PROCEDURE productpricing(
    OUT pl DECIMAL(8,2),
    OUT ph DECIMAL(8,2),
    OUT pa DECIMAL(8,2),
)
BEGIN
    SELECT Min(prod_price)
    INTO pl
    FROM products;
    SELECT Max(prod_price)
    INTO ph
    FROM products;
    SELECT Avg(prod_price)
    INTO pa
    FROM products;
END

此存储过程接受3个参数:pl存储产品最低价格,ph存储产品
最高价格,pa存储产品平均价格。每个参数必须具有指定的类 型,这里使用十进制值。关键字OUT指出相应的参数用来从存储过程传出 一个值(返回给调用者)。MySQL支持IN(传递给存储过程)、OUT(从存 储过程传出,如这里所用)和INOUT(对存储过程传入和传出)类型的参 数。存储过程的代码位于BEGIN和END语句内,如前所见,它们是一系列 SELECT语句,用来检索值,然后保存到相应的变量(通过指定INTO关键 字)。

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

由于此存储过程要求3个参数,因此必须正好传递3个参数,不
多也不少。所以,这条CALL语句给出3个参数。它们是存储过 程将保存结果的3个变量的名字。

注:所有MySQL变量都必须以@开始。

在调用时,这条语句并不显示任何数据。它返回以后可以显示(或 在其他处理中使用)的变量。

  • 为了显示检索出的产品平均价格,可如下进行:
SELECT  @priceaverage;
SELECT @pricehigh,@pricelow,@priceaverage;
  • eg:ordertotal接受订单号并返回该订单的合计
CREATE PROCEDURE ordertotal(
       IN  onumber INT,
       OUT ototal DECIMAL(8,2),
)
BEGIN
    SELECT Sum(item_price*quantity)
    FROM orderitems
    WHERE order_num = onumber
    INTO ototal;    
END

onumber定义为IN,因为订单号被传入存储过程。ototal定义
为OUT,因为要从存储过程返回合计。SELECT语句使用这两个 参数,WHERE子句使用onumber选择正确的行,INTO使用ototal存储计算 出来的合计。

  • 为调用这个新存储过程
CALL ordertotal(20005,@total);

必须给ordertotal传递两个参数;第一个参数为订单号,第二 个参数为包含计算出来的合计的变量名。

  • 为了显示此合计
SELECT @total;
  • 为了得到另一个订单的合计显示,需要再次调用存储过程,然后重 新显示变量:
CALL ordertotal(20009,@total);
SELECT @total;

⑤ 建立智能存储过程

⑥ 检查存储过程
为显示用来创建一个存储过程的CREATE语句,使用 SHOW CREATE PROCEDURE语句:

SHOW CREATE PROCEDURE ordertotal;

SHOW PROCEDURE STATUS列出所有存储过 程。为限制其输出,可使用LIKE指定一个过滤模式,例如:

SHOW  PROCEDURE STATUS LIKE 'ordertotal';

【MySQL必知必会】系列笔记:
【MySQL必知必会1-4章】学习笔记Day1
【MySQL必知必会5-7章】学习笔记Day2
【MySQL必知必会8-9章】学习笔记Day3
【MySQL必知必会10章】学习笔记Day4
【MySQL必知必会11-12章】学习笔记Day5
【MySQL必知必会13章】学习笔记Day6
【MySQL必知必会14-16章】学习笔记Day7
【MySQL必知必会17章】学习笔记Day8
【MySQL必知必会18章】学习笔记Day9
【MySQL必知必会19-20章】学习笔记Day10
【MySQL必知必会21-22章】学习笔记Day11

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章