19.1 存储过程
存储过程可以看成是对一系列 SQL 操作的批处理。
使用存储过程的好处:
- 代码封装,保证了一定的安全性;
- 代码复用;
- 由于是预先编译,因此具有很高的性能。
包含 in、out 和 inout 三种参数。
19.2 执行存储过程
存储过程的执行比编写要频繁的多。MySQL称存储过程的执行为调用,因此MySQL执行存储过程的语句为CALL。CALL接受存储过程的名字以及需要传递给它的任意参数。 看下面的例子:
CALL productpricing(@pricelow,
@pricehigh,
@priceaverage);
其中,执行名为productpricing的存储过程,它计算并返回产品的最低、最高和平均价格。
19.3 创建存储过程
让我们来看一个返回产品平均价格的存储过程的例子:
CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg( prod_price ) AS priceaverage
FROM products;
END;
此存储过程名为productpricing,用CREATE PROCEDURE productpricing()语句定义。如果存储过程接受参数,它们将在()中列举出来。BEGIN和END语句用来限定存储过程体,过程体本身仅是一个简单的SELECT语句。
在MySQL处理这段代码时,它创建一个新的存储过程productpricing。没有返回数据,因为这段代码并未调用存储过程,这里只是为以后使用而创建它。
如何使用这个存储过程?
CALL productpricing();
19.4 删除存储过程
DROP PROCEDURE productpricing;
注意没有使用后面的() ,只给出存储过程名。
19.5 使用参数
CREATE PROCEDURE productprcing( 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个参数,每个参数必须具有指定的类型,这里使用十进制值。 关键字OUT指出相应的参数用来从存储过程传出一个值(返回给调用者)。 MySQL支持IN(传递给存储过程)、 OUT(从存 储过程传出,如这里所用)和INOUT(对存储过程传入和传出)类型的参数。存储过程的代码位于BEGIN和END语句内。
调用此存储过程,必须指定3个变量名,如下所示:
CALL productpricing(@pricelow,
@pricehigh,
@priceaverage);
在调用时,这条语句并不显示任何数据。它返回以后可以显示(或在其他处理中使用)的变量。
为了显示检索出的产品平均价格,可如下进行:
SELECT @priceaverage;
为了获得3个值,可使用以下语句:
SELECT @pricelow, @pricehigh, @priceaverage;
19.6 检查存储过程
为显示用来创建一个存储过程的CREATE语句,使用SHOW CREATE PROCEDURE语句:
SHOW CREATE PROCEDURE ordertoal;
为了获得包括何时、由谁创建等详细信息的存储过程列表, 使用SHOW PROCEDURE STATUS。