存储过程
存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件,虽然它们的作用不仅限于批处理。
为什么使用存储过程
通过把处理封装在容易使用的单元中,简化复杂的操作(正如前面例子所述)。
由于不要求反复建立一系列处理步骤,这保证了数据的完整性。如果所有开发人员和应用程序都使用同一(试验和测试)存储过程,则所使用的代码都是相同的。这一点的延伸就是防止错误。需要执行的步骤越多,出错的可能性就越大。防止错误保证了数据的一致性。
简化对变动的管理。如果表名、列名或业务逻辑(或别的内容)有变化,只需要更改存储过程的代码。使用它的人员甚至不需要知道这些变化。
创建存储过程
CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(prod_price)AS priceverage
FROM products;
END;
执行存储过程
MySQL称存储过程的执行为调用,因此MySQL执行存储过程的语句为CALL。CALL接受存储过程的名字以及需要传递给它的任意参数。请看以下例子:
CALL productpricing()
其中,执行名为productpricing的存储过程,它计算并返回产品的最低、最高和平均价格。存储过程可以显示结果,也可以不显示结果
删除存储过程
存储过程在创建之后,被保存在服务器上以供使用,直至被删除。删除命令(类似于第21章所介绍的语句)从服务器中删除存储过程。
DROP PROCEDURE productpricing
仅当存在时删除 如果指定的过程不存在,则DROP PROCEDURE将产生一个错误。当过程存在想删除它时(如果过程不存在也不产生错误)可使用DROP PROCEDURE IF EXISTS。
使用参数创建存储过程
CREATE PROCEDURE productpricing(
OUT p1 DECIMAL(8,2),
OUT ph DECIMAL(8,2),
OUT pa DECIMAL(8,2)
)
BEGIN
SELECT Min(prod_price) INTO p1 FROM products;
SELECT Max(prod_price) INTO ph FROM products;
SELECT Avg(prod_price) INTO pa FROM products;
END;
使用CREATE PROCEDURE 关键字定义存储过程,这里存储过程名为productpricing
关键字OUT指出相应的参数用来从存储过程传出一个值(返回给调用者)
p1,ph,pa 为参数,每个参数必须具有指定的类型,这里使用十进制值。
存储过程的代码位于BEGIN和END语句内
如前所见,它们是一系列SELECT语句,用来检索值,然后保存到相应的变量(通过指定INTO关键字)。
参数的数据类型
存储过程的参数允许的数据类型与表中使用的数据类型相同。
注意,记录集不是允许的类型,因此,不能通过一个参数返回多个行和列。这就是前面的例子为什么要使用3个参数(和3条SELECT语句)的原因。
调用带参数的存储过程
CALL productpricing(
@pricelow,
@pricehigh,
@priceaverage
);
给的参数会被存储过程返回,可通过"返回参数"检索除返回值
SELECT @priceaverage;
为了获得3个值,可使用以下语句:
SELECT @pricehigh, @pricelow, @priceaverage
例子2:
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;
IN(传递给存储过程)
OUT(从存储过程传出
number定义为IN,因为订单号被传入存储过程。ototal定义为OUT,因为要从存储过程返回合计。SELECT语句使用这两个参数,WHERE子句使用onumber选择正确的行,INTO使用ototal存储计算出来的合计。必须给ordertotal传递两个参数;第一个参数为订单号,第二个参数为包含计算出来的合计的变量名
显示此合计
SELECT @total
为了得到另一个订单的合计显示,需要再次调用存储过程,然后重新显示变量:
CALL ordertotal(20009, @total)
SELECT @total;
显示某个存储过程的创建语句
SHOW CREATE PROCEDURE 存储过程的名字
为了获得包括何时、由谁创建等详细信息的存储过程列表,使用SHOWPROCEDURE STATUS。

浙公网安备 33010602011771号