MYSQL游标使用方法

游标

游标的特性

  • 不敏感:数据库可以选择不复制结果集
  • 只读
  • 不滚动:游标只能向一方向前进,并且不可以跳过任何一行数据

游标的优点

  • 游标是针对行操作的,对从数据库中 select 查询得到的结果集的 每一行可以
  • 进行分开的独立的相同或者不相同的操作,是一种分离的思想。

游标的缺点

  • 性能不高
  • 只能一行一行操作
  • 使用游标会产生死锁,造成内存开销大

游标的适用场景

  • 存储过程
  • 函数
  • 触发器
  • 事件

    游标使用方法

    游标五步法:
  • 一、声明一个游标:
    • DECLARE cursor_name CURSOR FOR select_statement 这个语句声明一个游标。也可以在子程序中定义多个游标,一个块中的每一个游标必须命名唯一。声明游标后也是单条操作的。
  • 二、打开定义的游标:
    • OPEN cursor_name 这个语句打开先前声明的游标。
  • 三、获得下一行数据:
    • FETCH cursor_name INTO var_name [, var_name] … 这个语句用指定的打开游标读取下一行(如果有下一行的话),并且前进游标指针至该行。
  • 四、需要执行的语句(增删改查):这里视具体情况而定
  • 五、释放游标:
    • CLOSE cursor_name 这个语句关闭先前打开的游标,注意,用完后必须关闭。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
DROP PROCEDURE UpdateImgURL;
/***游标***/
CREATE PROCEDURE UpdateImgURL()
BEGIN
-- 遍历数据结束标志
DECLARE Done INT DEFAULT 0;
DECLARE Imgurl CHAR(255) DEFAULT "";
-- 游标
DECLARE RS CURSOR FOR SELECT imgurl FROM weixin_linkface_userinfo ;
-- 异常处理
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
-- 打开游标
OPEN RS;
FETCH NEXT FROM RS INTO Imgurl;
REPEAT
IF NOT Done THEN
/**update 表名 set 字段名=REPLACE (字段名,'原来的值','要修改的值') where 条件 **/
END IF;
FETCH NEXT FROM RS INTO Imgurl;
UNTIL Done END REPEAT;
CLOSE rs;
END
/**执行存储过程**/
CALL UpdateImgURL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
BEGIN
DECLARE no_more_record INT DEFAULT 0;
DECLARE pID BIGINT(20);
DECLARE pValue DECIMAL(15,5);
DECLARE cur_record CURSOR FOR SELECT colA, colB from tableABC; /*首先这里对游标进行定义*/
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_record = 1; /*这个是个条件处理,针对NOT FOUND的条件,当没有记录时赋值为1*/


OPEN cur_record; /*接着使用OPEN打开游标*/
FETCH cur_record INTO pID, pValue; /*把第一行数据写入变量中,游标也随之指向了记录的第一行*/


WHILE no_more_record != 1 DO
INSERT INTO testTable(ID, Value)
VALUES (pID, pValue);
FETCH cur_record INTO pID, pValue;

END WHILE;
CLOSE cur_record; /*用完后记得用CLOSE把资源释放掉*/
END