MySQL 游标学习及使用实例

who?(游标是什么?)
游标(cursor)官方定义:是系统为用户开通的一个数据缓冲区,存放sql执行结果。每个游标区都有一个名字,用户可以通过sql语句逐一从游标中获取记录,并赋值给变量,交由主语言进一步处理;
个人理解:感觉游标和指针相似,指定结果集后一行行执行;

why?(为什么要学习游标)
游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;
它还提供对基于游标位置而对表中数据进行删除或更新的能力;
而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。

what?(游标的生命周期)
--1.声明游标

--2.打开游标

--3.声明游标提取数据所要存放的变量

--4.定位游标到哪一行

使用实例

1、搭配while循环语句使用

# 代码使用目的:update t_shop表中的数据

BEGIN
        -- 声明游标存储的变量
    DECLARE v_shop_name varchar(255);
    DECLARE v_shop_area varchar(32);
    DECLARE done int DEFAULT 0;

DECLARE chang_cursor CURSOR
    for select shop_name,shop_area from t_shop ;
    -- 游标中内容为空时设置为1
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    -- 打开游标
    OPEN chang_cursor;
    while done = 0 do   
            -- 将游标赋值给对应变量
            FETCH chang_cursor into v_shop_name,v_shop_area;
            if v_shop_name = '冰箱旗舰店' THEN
                        update t_shop set shop_area = '广东深圳' where shop_name = v_shop_name;
            END IF;
    end WHILE;
    -- 关闭游标
    close chang_cursor;
END

2、与loop循环语句使用

## 代码目的:统计t_shop表中的数据条数

BEGIN
    DECLARE done int DEFAULT 0;
    DECLARE v_shop_id VARCHAR(32);
    DECLARE total int DEFAULT 0;
    DECLARE v_shop_name VARCHAR(255);
    -- 定义游标
    DECLARE count_rnt CURSOR for select shop_id,shop_name from t_shop;
    -- 设定not found时done数据变化,FETCH获取指向的数据行,并把指针指向下一行,如何已经是最后一行那就会造成游标溢出,从而引发MySQL预定义的not found错误,所以可以通过设置变量让溢出时结束
    DECLARE CONTINUE HANDLER FOR NOT found set done = 1;
    -- 打开游标
    open count_rnt;   
    -- 设置循环条件
    read_loop:loop
            FETCH count_rnt into v_shop_id,v_shop_name ;
                    if done = 1 THEN
                    leave read_loop;
                    end IF;
            SET total = total + 1;
    end LOOP;
    -- 关闭游标
    CLOSE count_rnt;
    -- 输出结果
    select total;
END

3、与repeat循环语句使用

BEGIN
    DECLARE v_shop_id VARCHAR(30);
    DECLARE v_shop_name varchar(255);
    DECLARE done int default 0;
    DECLARE v_total int DEFAULT 0;
-- 定义游标
    DECLARE count_rnt1 CURSOR for select shop_id,shop_name from t_shop where shop_name regexp '美的';
-- 定义游标溢出的
    DECLARE CONTINUE HANDLER FOR NOT found set done = 1;
-- 打开游标
    open count_rnt1;
-- 循环语句
    REPEAT
    FETCH count_rnt1 into v_shop_id,v_shop_name;
                if    done = 0 THEN
                        set v_total = v_total + 1;
                end if ;
    UNTIL done = 1 end repeat;
-- 关闭游戏
    CLOSE count_rnt1;
    select v_total;
   
END

备注:相关知识

种类

MS SQL SERVER 支持三种类型的游标:Transact_SQL 游标,API服务器游标和客户游标。

(1)Transact_SQL 游标

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/71a2ea863b9127b335276605e5f97952.html