聊聊 MySQL 中的游标
[[435403]]
什么是游标?
游标(cursor)是一个存储在MySQL事业器上的数据库查询, 它不是一条SELECT语句,而是被该语句检索出来的效果集。在存储了游 标之后,哄骗秩序不错凭据需要转换或浏览其中的数据。
留意:MySQL游标只可用于 存储经由(和函数)。
创建游标在创建一个游标前,咱们需要先排除游方向语法
1、界说游标
DECLARE 游标称号 CURSOR FOR SQL语句;
2、绽放游标
OPEN 游标称号;
3、得到效果
FETCH 游标称号 INTO 变量称号[,变量称号];
4、关闭游标
CLOSE 游标称号;
咱们以Customers表来动作示例
示例一
界说一个存储经由,调用的技术扩充内部的游标
CREATE PROCEDURE PROC1() BEGIN -- 界说两个存放效果的变量 DECLARE NAME VARCHAR(20); DECLARE ADDR VARCHAR(50); -- 声明游标 DECLARE MY CURSOR FOR SELECT 姓名,地址 FROM customers; -- 绽放游标 OPEN MY; -- 得到效果 FETCH MY INTO NAME,ADDR; -- 这里是为了显露得到效果 SELECT NAME,ADDR; -- 关闭游标 CLOSE MY; END;
咱们扩充完上头的存储经由后,就不错调用该存储经由了
CALL PROC1();
得到效果:
这里详情有小伙伴意思意思,customers内外明明有7札纪录,为什么只显露了1札纪录?
这是因为游方向变量只保留了customers表中的第一滑数据,淌若要稽察后头的数据,就需要轮回往下迁移游标,才略陆续稽察。
示例二
界说一个存储经由,调用存储经由时,将表customers里的数据轮回写入新的表内部。
CREATE PROCEDURE PROC2() BEGIN -- 界说两个存放效果的变量 DECLARE FLAG INT DEFAULT 0; DECLARE NAME VARCHAR(20); DECLARE ADDR VARCHAR(50); -- 声明游标 DECLARE MY CURSOR FOR SELECT 姓名,地址 FROM customers; DECLARE CONTINUE HANDLER FOR NOT FOUND SET FLAG=1; -- 绽放游标 OPEN MY; -- 轮回体部分 L1:LOOP -- 得到效果 FETCH MY INTO NAME,ADDR; IF FLAG=1 THEN LEAVE L1; END IF; -- 这里是为了显露得到效果 INSERT INTO cus VALUES(NAME,ADDR); -- 关闭游标 END LOOP; -- 放置轮回 CLOSE MY; END;
然后咱们扩充这个存储经由,并查询cus内外的数据
CALL PROC2(); SELECT * FROM cus;
效果:
效果与customers里的一致,关联词这些效果是轮回一条一条往下迁移的经由中插入的,即这个轮回扩充了7次。
以上即是游方向基本操作旨趣了,此外游方向轮回体还有WHILE,REPEAT等操作格式,他们的操作格式与LOOP相同,齐是用来轮回扩充轮回体内部的实质,直到轮回放置。