1、游标是一个存储在MySQL服务器上的数据库查询,它不是一条select语句,而是被该语句所检索出来的结果集。
2、游标是针对行操作的,所以对从数据库中select查询得到的每一行可以进行分开的独立的相同或不同的操作,是一种分离的思想
3、游标的缺点是只能一行一行操作,在数据量大的情况下,是不适用的,速度过慢,会有死锁情况发生(几万条吧,10万左右就会经常)。

  • 新建表,插入数据
     CREATE TABLE IF NOT EXISTS `t_user` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `name` varchar(20) NOT NULL,
        `create_time` datetime DEFAULT NULL,
        PRIMARY KEY (`id`)
      ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7;
      
      INSERT INTO `t_user` (`id`, `name`,`create_time`) VALUES
      (1, 'zs','2019-04-20 12:12:12'),
      (2, 'ls','2019-04-20 12:12:12'),
      (3, 'ww','2019-04-20 12:12:12'),
      (4, 'gz','2019-04-20 12:12:12'),
      (5, 'mr','2019-04-20 12:12:12'),
      (6, 'ls','2019-04-20 12:12:12');
    
  • 创建存储过程,编写游标
    CREATE DEFINER=`xx`@`%` PROCEDURE `P_getAllDate`()
      BEGIN
       	DECLARE	id_ int(11);
       	DECLARE	name_ VARCHAR(24);
       	DECLARE doned INT DEFAULT 0;-- 结束标志变量
       	DECLARE total INT DEFAULT 0; -- 创建总数变量
      
           DECLARE  evt_cursor CURSOR  FOR(           	# 声明游标
         	SELECT DISTINCT id,name
         	FROM t_user  
      	WHERE  create_time>='2019-01-01 00:00:00'
     ); 
      	DECLARE CONTINUE HANDLER FOR NOT FOUND SET doned = 1;   # 设置结尾
          #设置初始值
          set total = 0;
      
           	open evt_cursor;  # 打开游标
             f_loop:LOOP-- ??
                  FETCH evt_cursor into id_, name_;
    
                  IF doned=1 THEN
                   LEAVE f_loop; ##--到结尾了跳出循环
                  END IF;  
                  -- 其他操作
                  set total = total + 1; -- 获取一条数据时,将count值进行累加操作;
                  end loop; -- 结束游标循环;
                  CLOSE evt_cursor; # 关闭游标
                  select total;-- 数量
      
      	END
    
  • 截图:
    在这里插入图片描述
    在这里插入图片描述
    1
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐