zoukankan      html  css  js  c++  java
  • MySQL 存储过程

    MySQL 5添加了对存储过程的支持

    可以单独编写每条语句,并根据结果有条件地执行另外的语句。在每次需要这个处理时(以及每个需要它的应用中)都必须做这些工作。可以创建存储过程。存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件,虽然它们的作用不仅限于批处理。

    为什么要使用存储过程

    下面列出一些主要的理由。

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

    ❑ 由于不要求反复建立一系列处理步骤,这保证了数据的完整性。如果所有开发人员和应用程序都使用同一(试验和测试)存储过程,则所使用的代码都是相同的。这一点的延伸就是防止错误。需要执行的步骤越多,出错的可能性就越大。防止错误保证了数据的一致性。❑ 简化对变动的管理。如果表名、列名或业务逻辑(或别的内容)有变化,只需要更改存储过程的代码。使用它的人员甚至不需要知道这些变化。这一点的延伸就是安全性。通过存储过程限制对基础数据的访问减少了数据讹误(无意识的或别的原因所导致的数据讹误)的机会。

    ❑ 提高性能。因为使用存储过程比使用单独的SQL语句要快。❑ 存在一些只能用在单个请求中的MySQL元素和特性,存储过程可以使用它们来编写功能更强更灵活的代码,换句话说,使用存储过程有3个主要的好处,即简单、安全、高性能。显然,它们都很重要。不过,在将SQL代码转换为存储过程前,也必须知道它的一些缺陷。

    ❑ 一般来说,存储过程的编写比基本SQL语句复杂,编写存储过程需要更高的技能,更丰富的经验。

    ❑ 你可能没有创建存储过程的安全访问权限。许多数据库管理员限制存储过程的创建权限,允许用户使用存储过程,但不允许他们创建存储过程。

    示例:

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

    此存储过程名为productpricing,用CREATE PROCEDURE productpricing()语句定义。如果存储过程接受参数,它们将在()中列举出来。此存储过程没有参数,但后跟的()仍然需要。BEGIN和END语句用来限定存储过程体

    CALL productpricing();

    因为存储过程实际上是一种函数,所以存储过程名后需要有()符号(即使不传递参数也需要)。

    DROP PROCEDURE IF EXISTS productpricing2;
     
    CREATE PROCEDURE productpricing2(
        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;

    删除刚创建的存储过程。请注意没有使用后面的(),只给出存储过程名。

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

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

    CALL productpricing2(@pricelow,@pricehigh,@priceaverage);
    select @pricelow,@pricehigh,@priceaverage;

    为调用此修改过的存储过程,必须指定3个变量名

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

    DROP PROCEDURE IF EXISTS 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存储计算出来的合计。

    存储过程在CREATE PROCEDURE语句中包含了一个COMMENT值。它不是必需的,但如果给出,将在SHOW PROCEDURE STATUS的结果中显示。

    CALL ordertotal(20005,@total);
    select @total;

    检查存储过程

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

    SHOW CREATE PROCEDURE ordertotal

    为了获得包括何时、由谁创建等详细信息的存储过程列表,使用SHOW PROCEDURE STATUS。

    SHOW PROCEDURE STATUS

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

    SHOW PROCEDURE STATUS like 'ordertotal'

    书籍:MySQL必知必会-第23章 使用存储过程

  • 相关阅读:
    WPF Caliburn 学习笔记(五)HelloCaliburn
    MSDN 教程短片 WPF 20(绑定3ObjectDataProvider)
    MSDN 教程短片 WPF 23(3D动画)
    比赛总结一
    HDU3686 Traffic Real Time Query System
    HDU3954 Level up
    EOJ382 Match Maker
    UESTC1565 Smart Typist
    HDU3578 Greedy Tino
    ZOJ1975 The Sierpinski Fractal
  • 原文地址:https://www.cnblogs.com/ooo0/p/14205842.html
Copyright © 2011-2022 走看看