MySQL 5添加了对存储过程的支持
经常会有一个完整的操作需要多条语句才能完成。可以创建存储过程,存储过程简单来说就是为以后的使用而保存一条或多条MySQL语句的集合。可将其视为批文件,虽然它们的作用不仅限于批处理。
简单、安全、高性能
缺陷:
即使你不能(或不想)编写自己的存储过程,也仍然可以在适当的执行别的存储过程。
调用 CALL,接受存储过程的名字以及需要传递给它的任意参数
CALL productpricing(@pricelow,
@pricehigh,
@priceaverage);
执行名为productpricing的存储过程,它计算并返回产品的最低、最高和平均价格。
存储过程可以显示结果,也可以不显示结果。
CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage
FROM products
END;
mysql命令行客户机的分隔符
默认的mysql语句分隔符为;mysql命令行实用程序也使用;作为语句分割符。如果命令行实用程序要解释存储过程自身内的;字符,则它们最终不会成为存储过程的成分,这会使存储过程中的SQL出现句法错误。
解决方法:临时更改命令行实用程序的语句分隔符
DELIMITER //
CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage
FROM products;
END//
DELIMITER ;
使用存储过程:
CALL productpricing();
存储过程实际是一种函数,所以存储过程名后需要有()符号,即使不传递参数也需要
DROP PROCEDURE productpricing;
注意没有使用后面的(),只给出存储过程名
如果指定的过程不存在,则DROP PROCEDURE将产生一个错误。
当过程存在想删除它时(如果过程不存在也不产生错误)可使用DROP PROCEDURE IF EXISTS
变量:内存中一个特定的位置,用来临时存储数据
所有MySQL变量都必须以@开始
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;
IN(传递给存储过程)、OUT(从存储过程传出,指出相应的参数用来从存储过程传出一个值)、INOUT(对存储过程传入和传出)
INTO(保存到相应的变量)
DECIMAL(8,2)指十进制数,小数点前8位,小数点后2位
调用该存储过程要求3个参数:
CALL productpricing(@pricelow,
@pricehigh,
@priceaverage);
显示检索出的产品平均价格:
SELECT @priceaverage;
案例: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;
调用这个新存储过程:
CALL ordertotal(20005,@total);
显示此合计:
SELECT @total
--Name:ordertotal
--Parameters:onumber=order number
-- taxable=0 if not taxable,1 if taxable
-- ototal=order total variable
CREATE PROCEDURE ordertotal(
IN onumber INT,
IN taxable BOOLEAN,
OUT ototal DECIMAL(8,2)
)COMMENT 'obtain order total,optionally adding tax'
BEGIN
--Declare variable for total
DECLARE total DECIMAL(8,2);
--Declare tax percentage
DECLARE taxrate INT DEFAULT 6;
--Get the order total
SELECT Sum(item_price*quantity)
FROM orderitems
WHERE order_num=onumber
INTO total;
--Is this taxable?
IF taxable THEN
--Yes,so add taxrate to the total
SELECT total+(total/100*taxrate) INTO total;
END IF;
--And finally,save to out variable
SELECT total INTO otatal;
END;
DECLARE定义了两个局部变量(要求指定变量名和数据类型,它也支持可选的默认值)
COMMENT关键字,将在SHOW PROCEDURE STATUS结果中显示
IF语句还支持ELSEIF和ELSE子句
CALL ordertotal(20005,0,@total);
SELECT @total;
显示用来创建一个存储过程的CREATE语句:
SHOW CREATE PROCEDURE ordertotal;
获取何时、由谁创建等详细信息的存储过程列表:
SHOW PROCEDURE STATUS
使用LINK指定一个过滤模式
SHOW PROCEDURE STATUS LINK ‘ordertotal’;
介绍什么是存储过程以及为什么使用存储过程。存储过程的执行和创建的语法以及使用存储过程的一些方法。