美文网首页
第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课 聊聊游标

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