24 游标

来源:互联网 发布:java ee怎么下载 编辑:程序博客网 时间:2024/05/22 13:48

为什么使用游标

有时需要在检索出来的行中前进或后移。
MySQL游标只能用于存储过程(存储过程完成后,游标就会消失)。

游标主要应用于交互式应用,用户需要滚动屏幕上的数据,并对数据进行浏览或做出修改。

使用游标步骤:

1、使用前必须声明(declare),这个过程并没有检索数据,只是定义要使用的selete语句;
2、一旦声明,必须打开(open)以供使用。这个过程用selete把数据实际检索出来;
3、对于填索数据的游标,根据需要取出各行;
4、在结束游标使用时,必须关闭(close)。

创建游标-declare

例:

create procedure processorders()begin    declare ordernumberscursor               //ordernumbers游标名    for    selete orders_num from orders;end;

打开/关闭游标

open ordernumbers;close ordernumbers;       //close释放游标使用的所有内存和资源。

注:一个游标关闭后,如果没有重新打开,则不能使用。

使用游标访问数据–fetch

例1:

create procedure processorders()begin    declare o INT;                  //声明变量 o    declare ordernumbers cursor    //声明并定义游标ordernumbers    for    selete orders_num from orders;    open ordernumbers;    fetch ordernumbers into o;                       //fetch检索当前行的orders_num列到一个名为o的局部声明的变量中    close ordernumbers;   end;

例2:循环检索

create procedure processorders()begin    declare done BOOLEAN default 0;    //声明变量done,用于控制循环     declare o INT;                                   declare ordernumbers cursor       //声明并定义游标ordernumbers    for    selete orders_num from orders;    declare  CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;    //当SQLSTATE '02000' 出现时,done=1。当没有更多的行供循环时,会出现这个条件。    open ordernumbers;    repeat        fetch ordernumbers into o;     until done end repeat;          //反复执行直到done为真    close ordernumbers;   end;

**注:**declare语句定义的局部变量,必须在定义任意游标之前定义,而句柄必须在游标之后定义。

(游标类似于编程语言如C++中的指针,声明并初始化之后才能使用;fetch类似于‘*’,访问数据;repeat相当于for,循环游标)
例3:

create procedure processorders()begin    declare done BOOLEAN default 0;              declare o INT;                                   declare t decimal(8,2);       //新的变量t    declare ordernumbers cursor                      for    selete orders_num from orders;    declare continue handler for SQLstate'02000' set done=1;   //当SQLSTATE '02000' 出现时,done=1。当没有更多的行供循环时,会出现这个条件。    create table if not exist ordertotal   //创建一个表,用于存储结果    (order_num int,total decimal(8,2));     open ordernumbers;    repeat    fetch ordernumbers into o;                 call ordertotal(o,1,t);    insert into ordertotal (order_num,total)    values(o,t);    until done end repeat;          //反复执行直到done为真    close ordernumbers;   end;