聊聊 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相同,齐是用来轮回扩充轮回体内部的实质,直到轮回放置。