SP中游标的使用

游标的使用格式:

DELCARE 游标名称 CURSOR FOR SELECT 字段1,字段2,字段3,...FROM 表名 WHERE...
OPEN 游标名称
FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
WHILE @@FETCH_STATUS = 0
	BEGIN
		SQL语句执行过程
		FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
	END
CLOSE 游标名称
DEALLOCATE 游标名称(删除游标)

游标的循环遍历:

create PROCEDURE proc2()
BEGIN
declare cur_sid varchar(20);
declare cur_sname varchar(20);
declare cur_sex varchar(20);
declare cur_age varchar(20);
declare cur_classno varchar(20);

declare sum int default 0;
declare i int default 0;
--1.
declare student_cur1 CURSOR for
select sid,sname,sex,age,classno from student;

--2.
open student_cur1;
--3. 最简单的 while遍历方法
select count(sid) into sum from student;
while i<sum DO
	fetch student_cur1 into cur_sid,cur_sname,cur_sex,cur_age,cur_classno;
	select cur_sid,cur_sname,cur_sex,cur_age,cur_classno;
	set i=i+1;
end while;
--4.
close student_cur1;
END

--执行存储过程
call proc2();
--删除存储过程
drop procedure if exists proc2

使用 loop 遍历游标:

create PROCEDURE proc3()
	BEGIN
	declare cur_sid varchar(20);
	declare cur_sname varchar(20);
	declare cur_sex varchar(20);
	declare cur_age varchar(20);
	declare cur_classno varchar(20);

declare state int default false; -- 定义表示用于判断游标是否溢出
-- 1、
declare student_cur1 CURSOR for
select sid,sname,sex,age,classno from student;
-- 2、
open student_cur1;
-- 3、 loop 遍历游标
cur_loop:loop -- 循环开始
-- 循环开始的时候提取一次
        fetch student_cur1 into cur_sid,cur_sname,cur_sex,cur_age,cur_classno;
        select cur_sid,cur_sname,cur_sex,cur_age,cur_classno;

        if state then
            leave cur_loop; 
        end if; 
end loop; -- 循环结束
-- 4、
close student_cur1;
END

-- 执行存储过程
call proc3()
-- 删除存储过程
drop procedure if exists proc3

FETCH 是获取游标当前指向的数据行,并且将指针指向下一行,当游标已经指向最后一行时会造成游标溢出.
使用loop循环游标时,他本身是不会监控是否到最后一条数据了.

用于判断游标是否溢出的两种写法:
1.declare continue HANDLER for not found set done = true;
2.DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' set done = true;

@@FETCH_STATUS返回值及含义:

@@FETCH_STATUS = 0    FETCH 语句成功
@@FETCH_STATUS = -1   FECTCH语句失败或此行不在结果集中
@@FETCH_STATUS = -2  被提取的行不存在

使用游标实现类似于for 循环的操作:

BEGIN
    DECLARE t VARCHAR(200);
    DECLARE t1 int ;
    DECLARE ls_cursor CURSOR FOR SELECT name FROM user;
    #游标结束时,设置状态
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET t1=1;
    SET t1=0;
    #开启游标
    OPEN ls_cursor;
    FETCH next FROM ls_cursor into t;
    WHILE (t1=0) DO
            #设置业务逻辑
            SELECT t as 结果;
            FETCH next FROM ls_cursor into t;
    END WHILE;
    #关闭游标
    CLOSE ls_cursor;
END
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值