游标是为了一行一行的处理表格检索到的结果,游标只能在存储过程中使用
使用游标的步骤:
- 必须先声明游标,但这个过程并没有检索数据,仅仅是一个声明
- 如果想要使用游标,必须打开它,这个过程实际上把之前的select语句检索出来
- 对填有数据的游标,检索出各行
- 结束使用后必须关闭游标,这会进行资源的释放
24.1 创建游标
create procedure processorders()
begin
declare ordernumbers cursor
for
select order_num from orders;
end;
上述语句声明了一个名叫ordernumbers的游标
24.2 打开和关闭游标
open ordernumbers;
close ordernumbers;
// close语句会释放所有的内存和持有的资源,因此,在不再使用游标的时候一定要手动关闭。(如果不手动关闭,在到达end语句时,也会自动的关闭)
使用游标数据
下面的语句用游标取出第一条数据
create procedure processorders()
begin
declare ordernumbers cursor
for
select order_num from orders;
deaclare o int;
open ordernumbers;
fetch ordernumbers into o;
close ordernumbers;
end;
下面的语句循环第一行到最后一行
create procedure processorders()
begin
declare ordernumbers cursor
for
select order_num from orders;
-- declare continue handler
declare done boolean defalut 0;
// continue handler是在满足条件时执行的代码
declare continue handler for sqlstate '02000' set done = 1; // sqlate '02000'时一个未找到条件,当没有新行sqlstate='02000'
deaclare o int;
open ordernumbers;
repeat
fetch ordernumbers into o;
unitl done end repeat;
close ordernumbers;
end;
使用游标的一个复杂存储过程
功能:计算orders的每个订单的总计,并且将最终结果存到一个表格中.
create procedure processorder()
begin
declare t int;
declare o int;
-- declare a cursor
declare c cursor
for
select order_num from orders;
-- declare continue handler
declare continue handler for sqlstate '02000' SET done = 1;
-- create a table store the results
create table if not exists ordertotals (
order_num int, total decimal(8,2));
open c;
repeat
fetch c inot o;
call ordertatal(o, 1, t);
insert into ordertotals values(o, t);
until done end repeat;
end;