第二十三章--使用存储过程
1.存储过程:存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。
2.为什么要使用存储过程?
(1)通过把处理封装在容易使用的单元中,简化复杂的操作(正如前 面例子所述)。
(2)由于不要求反复建立一系列处理步骤,这保证了数据的完整性。 如果所有开发人员和应用程序都使用同一(试验和测试)存储过 程,则所使用的代码都是相同的。
这一点的延伸就是防止错误。需要执行的步骤越多,出错的可能性就越大。防止错误保证了数据的一致性。
(3)简化对变动的管理。如果表名、列名或业务逻辑(或别的内容) 有变化,只需要更改存储过程的代码。使用它的人员甚至不需要 知道这些变化。
(4)提高性能。因为使用存储过程比使用单独的SQL语句要快。
(5)存在一些只能用在单个请求中的MySQL元素和特性,存储过程可 以使用它们来编写功能更强更灵活的代码。
3.执行存储过程:ySQL执行存储过程的语句 为CALL。
例如:执行名为productpricing的存储过程,它计算并返回产品的最低、最高和平均价格。
call productpricing(@pricelow,
@pricehigh,
@priceaverage);
4.创建存储过
例如:create procedure productpricing()
begin
select avg(prod_price) as priceaverage from products
end;
此存储过程名为productpricing,用CREATE PROCEDURE productpricing()语句定义。如果存储过程接受参数,它们将在()中列举出来。此存储过程没 有参数,但后跟的()仍然需要。BEGIN和END语句用来限定存储过程体,过程体本身仅是一个简单的SELECT语句
5.删除存储过程
例如:drop procedure productpricing;
仅当存在时删除:如果指定的过程不存在,则DROPPROCEDURE将产生一个错误。当过程存在想删除它时,可使用DROP PROCEDURE IF EXISTS。
6.变量(variable)内存中一个特定的位置,用来临时存储数据。
7.使用参数
例如: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;
解释:关键字OUT指出相应的参数用来从存储过程传出 一个值(返回给调用者)。MySQL支持IN(传递给存储过程)、OUT(从存储过程传出,如这里所用)和INOUT(对存储过程传入和传出)类型的参 数。存储过程的代码位于BEGIN和END语句内,如前所见,它们是一系列SELECT语句,用来检索值,然后保存到相应的变量(通过指定INTO关键字)。
8.变量名 所有MySQL变量都必须以@开始。
9.检查存储过程, SHOW CREATE PROCEDURE
第二十三章--游标
1.游标(cursor)是一个存储在MySQL服务器上的数据库查询, 它不是一条SELECT语句,而是被该语句检索出来的结果集。
2.使用游标
(1)能够使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的SELECT语句。
(2)一旦声明后,必须打开游标以供使用。这个过程用前面定义的SELECT语句把数据实际检索出来。
(3)对于填有数据的游标,根据需要取出(检索)各行。
(4)在结束游标使用时,必须关闭游标。
3.创建游标
DECLARE命名游标,并定义 相应的SELECT语句,根据需要带WHERE和其他子句。
例如:create procedure processorders()
begin
declare ordernumbers cursor
for
select order_num from products;
end;
存储过程处理完成后,游标就 消失(因为它局限于存储过程)
4.打开和关闭游标:游标用OPEN CURSOR语句来打开, 关闭:close ordernumbers;
5.使用声明过的游标不需要再次声明,用OPEN语句打开它就可以了。
6.隐含关闭: 如果你不明确关闭游标,MySQL将会在到达END语句时自动关闭它。
7.使用游标数据:可以使用FETCH语句分别访问它的每一行.FETCH指定检索什么数据(所需的列),检索出来的数据存储在什么地方。 它还向前移动游标中的内部行指针,使下一条FETCH语句检索下一行(不 重复读取同一行)。