Qianfeng

DON'T WORRY BE HAPPY
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

mysql笔记24:使用游标

Posted on 2022-02-22 16:49  RonnieOS  阅读(52)  评论(0编辑  收藏  举报

游标是为了一行一行的处理表格检索到的结果,游标只能在存储过程中使用

使用游标的步骤:

  1. 必须先声明游标,但这个过程并没有检索数据,仅仅是一个声明
  2. 如果想要使用游标,必须打开它,这个过程实际上把之前的select语句检索出来
  3. 对填有数据的游标,检索出各行
  4. 结束使用后必须关闭游标,这会进行资源的释放

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;