存储过程简单来说,就是为了以后的使用而保存的一条或多条MySQL语句的集合。
为什么使用存储过程
通过把处理封装在容易使用的单元中,简化复杂的操作
由于不要求反复建立一系列处理步骤,这保证了数据的完整性。如果所有开发人员和应用程序都使用同一存储过程,则所使用的代码都是相同的。 这一点延伸就是防止错误。需要执行的步骤越多,出错的可能性就越大。防止错误保证了数据的一致性。
简化对变动的管理。如果表名、列名或业务逻辑有变化,只需要更改存储过程的代码。使用它的人员甚至不需要这些变化。 这一点的延伸就是安全性。通过存储过程限制对基础数据的访问,减少了数据讹误的机会。
提高性能。因为使用存储过程比使用单独的SQL语句要快。
存在一些只能用在单个请求中的MySQL元素和特性,存储过程可以使用他们来编写功能更强更灵活的代码。
使用存储过程
创建存储过程
使用 CREATE PROCEDURE定义存储过程。如果存储过程接受参数,它们将在存储过程名称括号中列举出来。BEGIN和END语句来限定存储过程体。
//默认的MySQL命令行分隔符是; "DELIMITER //"告诉命令行实用程序使用"//"作为新的语法结束分隔符。
DELIMITER //
CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage
FROM products;
END //
使用
CALL productpricing();
删除存储过程
DROP PROCEDURE productpricing;
使用参数
变量:内存中一个特定的位置,用来临时存储数据,都必须以@开始。
参数的数据类型: 存储过程的参数允许的数据类型与表中使用的数据类型相同。记录集是不允许的类型,因此,不能通过一个参数返回多个行和列。
OUT指出相应的参数用来从存储过程传出一个值(返回给调用者),IN (传递给存储过程),INOUT(对存储过程传入传出)
通过关键字INTO将查询结果保存到相应的变量。
//定义带参数的存储过程
DELIMITER //
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 //
//调用带参数的存储过程
CALL productpricing(@pricelow,
@pricehigh,
@priceaverage
);
//显示调用结果
SELECT @pricelow,@pricehigh;
DELIMITER //
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(20009,@total);
SELECT @total;
检查存储过程
SHOW PROCEDURE STATUS;查看所有的存储过程,可使用LIKE限制
SHOW PROCEDURE STATUS LIKE 'ordertotal';
//查看创建此存储过程的语句
SHOW CREATE PROCEDURE ordertotal;
结果: