游标学习


MySql检索操作返回一组称为结果集的行。这组返回的行都是与sql语句相匹配的行(0行或多行)。用简单的select语句,例如,没有办法得到第一行,下一行或前10行。也不存在每次一行地处理所有的行简单办法(相对于成批的处理他们)。


目前游标只用于存储过程或函数里

一、声明游标
declare 游标名 cursor for 相应的select语句


二、打开和关闭游标
OPEN 游标名r;

CLOSE 游标名;

例1:
create procedure proce_cursor_demo()
BEGIN
    -- 声明变量
    declare o int;
    -- 声明游标
    declare cur_user CURSOR
    FOR
    select age from `user`;
    OPEN cur_user;
    FETCH cur_user INTO o;
    CLOSE cur_user;

END


FETCH用来检索当前行的age列(将自动从第一行开始)赋值到一个名为o的局部声明的变量中。

declare语句的次序:1、局部变量 2、游标 3、句柄。 不遵守此顺序将产生错误。

 


例2:

create procedure proce_cursor_demo2()
BEGIN
    -- 声明变量 
    declare done boolean default 0;
    declare i int;
    declare a int;

    -- 声明游标
    declare cur_get_age_for_id CURSOR
    FOR
    SELECT id FROM `user`;

    -- 声明句柄
    declare continue handler  for SQLSTATE '02000' set done = 1;

    -- 创建用来保存id和age的表
    create table if not exists u_age
        (uid int,age int);
        
    -- open the curson
    OPEN cur_get_age_for_id;
    
    -- 遍历所有行
    REPEAT
        -- 得到id
        FETCH cur_get_age_for_id INTO i;
        -- 调用外部存储过程 得到age
        CALL proce_age_for_id(i,0,a);
        -- 插入到u_age表
        insert into u_age(uid,age) VALUES (i,a);
    
    -- 结束遍历
    UNTIL done END REPEAT;

    -- close the curson
    CLOSE cur_get_age_for_id;
    
END;

-- 执行函数
CALL proce_cursor_demo2();

 

 

理解:
REPEAT 是循环用的
结束条件是 UNTIL done END REPEAT; (done 是上面定义的布尔变量。为真时结束循环)


declare continue handler for SQLSTATE '02000' set done = 1;
这条名句定义了一个chontinue handler ,当SQLSTATE '02000'出现时,set done = 1就执行。(SQLSTATE '02000'是未找到条件,当数据遍历到末尾就出现)

 

转载于:https://www.cnblogs.com/longhs/p/4338221.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值