美文网首页
第21课 聊聊游标

第21课 聊聊游标

作者: 猫哥的技术博客 | 来源:发表于2019-04-09 22:24 被阅读0次

游标

有点像迭代器, 一次向前推进一步, 所以如果想全部读取内容, 需要使用循环, 同时需要监听结束, 以便跳出循环

那什么时候回使用游标呢?

需要一条一条修改数据的时候...

drop table if exists teacher;
CREATE TABLE `teacher` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `salary` int(11) NOT NULL,
  `sex` tinyint(1) NOT NULL COMMENT '1 for male, 2 for female',
  `name` char(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO `teacher`(`id`, `salary`, `sex`, `name`) VALUES (1, 4500, 1, '教师1');
INSERT INTO `teacher`(`id`, `salary`, `sex`, `name`) VALUES (2, 5500, 2, '教师2');
INSERT INTO `teacher`(`id`, `salary`, `sex`, `name`) VALUES (3, 6500, 2, '教师3');
INSERT INTO `teacher`(`id`, `salary`, `sex`, `name`) VALUES (4, 7500, 1, '教师4');
INSERT INTO `teacher`(`id`, `salary`, `sex`, `name`) VALUES (5, 8500, 2, '教师5');
image.png

假如有一张教师表, 工资有高有低, 为了平均收入, 拉低贫富差距, 校长决定, 工资大于等于5000的老师, 工资减一千, 工资低于5000的老师, 每人工资加一千

应该怎么做呢? 像这样?

update teacher set salary = salary - 1000 where salary >= 5000;
update teacher set salary = salary + 1000 where salary < 5000;

恐怕不行, 如果一个老师原来的工资是5500, 那么第一句之后, 他的工资会变成4500;
再执行第二句的时候, 他的工资又变回了5500...

所以不能全部update, 需要一条一条的修改, 这就需要游标了...

drop PROCEDURE if exists change_salary;
create PROCEDURE change_salary() begin 
    declare tid int default 0;
    declare tsalary int default 0;
    declare done int default 0;
    declare cur cursor for select id,salary from teacher;
    declare continue handler for not found set done = 1;
    open cur;
        myloop:loop
            fetch cur into tid,tsalary;
            if tsalary >= 5000 then
                update teacher set salary = tsalary - 1000 where id  = tid;
            else
                update teacher set salary = tsalary + 1000 where id  = tid;
            end if;
            if done then leave myloop;
            end if;
        end loop;
    close cur;
end;
call change_salary();

比较一下两者的结果差异

image.png image.png image.png

最后这个结果, 才是我们想要的

相关文章

  • 第21课 聊聊游标

    游标 有点像迭代器, 一次向前推进一步, 所以如果想全部读取内容, 需要使用循环, 同时需要监听结束, 以便跳出循...

  • 《mysql必知必会》读书实战笔记24-游标

    第24章 使用游标 24.1 游标 游标,是一个select语句的查询结果集,用于交互式应用,如:滚动屏幕上的数据...

  • MongoDB之文档游标

    游标 查询操作返回的结果游标 游标的迭代与操作 db.collecton.find() 返回一个文档集合游标,在不...

  • sqlserver 游标

    游标更新删除当前数据 1.声明游标 2.打开游标 3.声明游标提取数据所要存放的变量 4.定位游标到哪一行 5.关...

  • Oracle 存储过程学习笔记

    1、存储过程简单实例 2.游标实现方式 显式游标实现方式(可多值) 隐式游标(可以实现查询多值) 带有参数的游标(...

  • sql server 游标

    定位到结果集中某一行 游标分类 静态游标(Static):在操作游标的时候,数据发生变化,游标中数据不变。 动态游...

  • 实验九 游标操作和自定义函数

    一.实验目的: 掌握游标的声明、游标打开、标数据的提取、游标的关闭和游标的释放 掌握标量值函数的定义与调用 掌握内...

  • sql 游标,函数,触发器

    游标是数据库的一种机制或类型,可以存储结果集 ,迭代和遍历结果集,oracle中游标大致分为显示游标和隐式游标。 ...

  • GraphQL(七):GraphQL分页及原理分析

    基于GraphQl-JAVA 11.0 GraphQL的分页是基于游标的,游标分页的方式可以提升用户体验,关于游标...

  • SQL-游标循环记录

    declare @temp_temp int --创建游标 --Local(本地游标) DECLARE a...

网友评论

      本文标题:第21课 聊聊游标

      本文链接:https://www.haomeiwen.com/subject/lguwiqtx.html