MySQL游标详解

时间:2021-10-28 01:17:22

1、游标的概述和理解

游标也叫光标,SQL语句查询出来是一个结果集,但是不能像指针一样定位到每一条记录,游标可以对查询出来的结果集中每一条记录进行定位处理select一次性得到很多内容,但是想对这些内容进行加工(操作),操作完显示在屏幕上。
游标充当指针的作用,操作游标来对数据进行操作、游标一般用在存储过程中

案例理解:
declare cursor_example cursor for select * form user where name like '李%';
定义了一个游标 cursor_example,把select的结果集放到cursor_example里面,游标cursor_example就是一个容器或者一个内存块

2、使用游标的步骤

游标一般有四个步骤:

  • 声明定义游标
  • 打开游标
  • 使用游标
  • 关闭游标

2.1、声明游标

在MySQL用declare关键字声明,语法如下:

declare 游标名 cursor for select 语句;

比如下面的声明游标:

declare cursor_name cursor for select * from user where name like '%阳%';

2.2 打开游标

声明好了游标,在使用前需要打开游标,打开游标时会把select查询的集合送到游标工作区,为后面逐条读取数据准备。

open 游标名;

2.3 使用游标

语法:

fetch 游标名 into 变量名....

fetch是一行一行的获取游标里的内容的,如果游标读取的数据有多列,得需要into 多个变量中。

简单看一个案例:

delimiter $
create procedure girls.demo7()
begin
    declare id int default null;
    declare id2 varchar(20) default null;
    declare cursor_test cursor for select * from user;
    open cursor_test;
    fetch cursor_test into id,id2;
    select id,id2;
    close cursor_test;
end $
delimiter ;

call demo7();

MySQL游标详解
这里只是显示一行数据,实际上不止一条数据的。为啥呢,因为fetch每次都是读取cursor_test的第一行(指针指向的第一行

2.4 关闭游标

游标是占用资源的,需要关闭的,关闭就无法再获取结果数据集了,需要重新打开。语法如下:

close 游标名;

3、案例

declare continue handler for not found set yy = 1; 判断循环是否结束,游标到最后一行数据的依据

drop procedure demo8;
delimiter $
create procedure girls.demo8(IN input_salary float,OUT cv_name varchar(20))
begin
    declare c_name varchar(20) default null;
    declare v_name varchar(100) default '';
    declare yy int default 0;
    declare cursor_name cursor for select name from employees where salary <= input_salary;
    declare continue handler for not found set yy = 1;
    open cursor_name;
    repeat
        fetch cursor_name into c_name;
        if !yy then
            set c_name = concat(c_name,',');
            set v_name = concat(v_name,c_name);
        end if;
        until  yy
    end repeat;
    set cv_name = v_name;
    close cursor_name;
end $
delimiter ;

select name from employees where salary <=8000;

select concat(null,'lisi'); # 为null
select concat('','lisi'); # 为lisi
call demo8(8000,@cv_name);
select @cv_name;

使用FETCH语句获取游标数据最后一行重复,进入循环对标志yy进行判断是否为1。

参看学习:
1、深入学习MySQL游标
2、使用FETCH语句获取游标数据最后一行重复
3、MySQL 游标详解