MySQL必知必会 第23章 使用存储过程

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

23.1 存储过程

经常会有一个完整的操作需要多条语句才能完成。可以创建存储过程,存储过程简单来说就是为以后的使用而保存一条或多条MySQL语句的集合。可将其视为批文件,虽然它们的作用不仅限于批处理。

23.2 为什么要使用存储过程

简单、安全、高性能

  • 通过把处理封装在容易使用的单元中,简化复杂的操作
  • 由于不要求反复建立一系列处理步骤,保证了数据的完整性,防止错误。
  • 简化对变动的管理。
  • 提高性能
  • 存在一些只能用在单个请求中的MySQL元素和特性,存储过程可以使用它们来编写功能更强更灵活的代码。

缺陷:

  • 存储过程的编写比基本SQL语句复杂,编写存储过程需要更高的技能,更丰富的经验
  • 可能没有创建存储过程的安全访问权限。许多数据库管理员限制存储过程的创建权限,允许用户使用存储过程,但不允许他们创建存储过程

即使你不能(或不想)编写自己的存储过程,也仍然可以在适当的执行别的存储过程。

23.3 使用存储过程

23.3.1 执行存储过程

调用 CALL,接受存储过程的名字以及需要传递给它的任意参数

CALL productpricing(@pricelow,
					@pricehigh,
					@priceaverage);

执行名为productpricing的存储过程,它计算并返回产品的最低、最高和平均价格。
存储过程可以显示结果,也可以不显示结果。

23.3.2 创建存储过程

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();

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

23.3.3 删除存储过程

DROP PROCEDURE productpricing;

注意没有使用后面的(),只给出存储过程名
如果指定的过程不存在,则DROP PROCEDURE将产生一个错误。
当过程存在想删除它时(如果过程不存在也不产生错误)可使用DROP PROCEDURE IF EXISTS

23.3.4 使用参数

变量:内存中一个特定的位置,用来临时存储数据
所有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

23.3.5 建立智能存储过程

--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;

23.3.6 检查存储过程

显示用来创建一个存储过程的CREATE语句:

SHOW CREATE PROCEDURE ordertotal;

获取何时、由谁创建等详细信息的存储过程列表:

SHOW PROCEDURE STATUS

使用LINK指定一个过滤模式

SHOW PROCEDURE STATUS LINK ‘ordertotal’;

23.4 小结

介绍什么是存储过程以及为什么使用存储过程。存储过程的执行和创建的语法以及使用存储过程的一些方法。

你可能感兴趣的:(mysql必知必会,mysql,数据库)