24 游标

本文介绍了MySQL中游标的使用方法,包括声明、打开、关闭及通过fetch访问数据等操作。此外,还提供了多个示例,展示了如何利用游标进行数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么使用游标

有时需要在检索出来的行中前进或后移。
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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值