WithCoderWithCoderWithCoder

MySQL游标使用

    MySQL游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标充当指针的作用,它能对查询数据库所返回的记录按行进行遍历,以便进行相应的操作。

    游标具有以下特性:

    1. 不敏感:数据库可以选择不复制结果集

    2. 只读

    3. 不滚动:游标只能向一方向前进,并且不可以跳过任何一行数据

    游标的优点:

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

    游标的缺点:

    1. 性能不高

    2. 只能一行一行操作

    3. 使用游标会产生死锁,造成内存开销大

    游标的适用场景:

    1. 存储过程

    2. 函数

    3. 触发器

    4. 事件

    我们先看以下代码,声明了一个存储过程,在存储过程中使用了游标:   

-- 修改mysql默认的分隔符为: $$
DELIMITER $$

-- 如果存储过程存在,删除
DROP PROCEDURE IF EXISTS test$$

-- 创建存储过程
CREATE PROCEDURE test()  
BEGIN
   -- 声明变量
   DECLARE _id INT;
   DECLARE flag INT DEFAULT 0;
   
   -- 1.定义一个游标来记录sql查询的结果
   DECLARE members CURSOR FOR SELECT id FROM tn_member;
   
   -- 为while循环建立一个退出标志,当游标遍历完后将flag的值设置为1
   DECLARE EXIT HANDLER FOR NOT FOUND SET flag = 1;
   
   -- 2. 打开游标
   OPEN members;
   
   WHILE flag!=1 DO
        -- 3. 取出游标中的一行数据,并且游标往后移
        FETCH members INTO _id;
        UPDATE tn_member SET age = age + 1 WHERE id = _id;
   END WHILE;
   
   -- 4. 关闭游标
   CLOSE members;   
END$$

DELIMITER ;

    游标的操作主要分为以下几步:

    1. 定义游标:

    DECLARE 游标名称 CURSOR FOR 查询语法   

   -- 1.定义一个游标来记录sql查询的结果
   DECLARE members CURSOR FOR SELECT id FROM tn_member;

    2. 打开游标

    OPEN 游标名称

   -- 2. 打开游标
   OPEN members;

    3. 取出游标中的一行数据,并且游标往后移

    FETCH 游标名称 INFO var_name [,var_name ].....   

    -- 3. 取出游标中的一行数据,并且游标往后移
    FETCH members INTO _id;

    4. 关闭游标

    CLOSE 游标名称;

   -- 4. 关闭游标
   CLOSE members;

    对游标的循环,可以使用while、repeat等,本文使用while进行循环。

    注意:

    在声明游标退出标志时,如果使用“DECLARE CONTINUE HANDLER FOR NOT FOUND”,我们会发现while循环多执行了一次。此时,我们可以使用EXIT声明来解决这个问题。即“DECLARE EXIT HANDLER FOR NOT FOUND”。EXIT与CONTINUE的区别是::EXIT触发后,后面的语句不再执行,而CONTINUE还需要继续执行。

欢迎分享交流,转载请注明出处:WithCoder » MySQL游标使用