1、游标的基本概念
有数据缓冲的思想:游标的设计是一种数据缓冲区的思想,用来存放SQL语句执行的结果。
先有数据基础:游标是在先从数据表中检索出数据之后才能继续灵活操作的技术。
类似于指针:游标类似于指向数据结构堆栈中的指针,用来pop出所指向的数据,并且只能每次取一个。
如果你前面看过mysql函数,会发现无法使用返回多行结果的语句。但如果你又确实想要使用时,就需要使用到游标,游标可以帮你选择出某个结果(这样就可以做到返回单个结果)。
另外,使用游标也可以轻易的取出在检索出来的行中前进或后退一行或多行的结果。
游标可以遍历返回的多行结果。
2、游标的使用
游标的使用一般分为5个步骤,主要是:定义游标->打开游标->使用游标->关闭游标->释放游标。
前提:
-- 创建两个表,表没有主键会一直循环 CREATE TABLE class(id int(5) PRIMARY KEY,name VARCHAR(10)); CREATE TABLE class2(id int(5) PRIMARY KEY,name VARCHAR(10)); -- class里插入数据 INSERT INTO class(`id`, `name`) VALUES (‘1‘, ‘ceshi‘); SELECT * FROM class ; -- class表里数据删除或者删除表 DELETE FROM class2; DROP TABLE class2;
create procedure p2() begin declare id int; declare name varchar(15); -- 声明游标 declare mc cursor for select * from class; -- 打开游标 open mc; -- 获取结果 loop -- 循环,将表的内容都转移到class2中 fetch mc into id,name; -- 这里是为了显示获取结果 insert into class2 values(id,name); -- 关闭游标 end loop; close mc; end;
上述代码报错
表class2有主键,不断循环的话,始终会达到表的末尾,到了末尾就无法继续fetch,一般来说都要避免报错,到了末尾前会有一个mysql定义的
delimiter // create procedure p2() begin declare id int; declare name varchar(15); -- 声明游标 declare mc cursor for select * from class; -- 打开游标 open mc; -- 获取结果 loop -- 循环,将表的内容都转移到class2中 fetch mc into id,name; if flag=1 then -- 当无法fetch会触发handler continue leave l2; end if; -- 这里是为了显示获取结果 insert into class2 values(id,name); -- 关闭游标 end loop; close mc; end; // delimiter ; CALL p2();
原文:https://www.cnblogs.com/shishibuwan/p/10972655.html