发布网友 发布时间:2022-04-26 14:18
共2个回答
懂视网 时间:2022-04-07 19:03
mysql存储过程中游标遍历的方法:
CREATE DEFINER=`root`@`%` PROCEDURE `updStatus`() BEGIN DECLARE startTime DATETIME; DECLARE endTime DATETIME; DECLARE curTime DATETIME; DECLARE id VARCHAR(36); DECLARE estatus VARCHAR(4); -- 遍历数据结束标志 DECLARE done INT DEFAULT FALSE; -- 游标 DECLARE examIds CURSOR FOR SELECT EXAM_ID FROM t_exam WHERE EXAM_STATUS = 1 or EXAM_STATUS = 2; -- 将结束标志绑定到游标 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN examIds; -- 遍历 read_loop: LOOP -- 取值 取多个字段 FETCH NEXT from examIds INTO id; IF done THEN LEAVE read_loop; END IF; SELECT EXAM_STATUS INTO estatus FROM t_exam WHERE EXAM_ID = id ; IF estatus =1 THEN SELECT NOW() INTO curTime; SELECT EXAM_START_TIME INTO startTime from t_exam WHERE EXAM_ID = id ; SELECT EXAM_END_TIME INTO endTime from t_exam WHERE EXAM_ID = id ; IF curTime >= startTime AND endTime > curTime THEN UPDATE t_exam SET EXAM_STATUS = 2 WHERE EXAM_ID = id; ELSEIF curTime >= endTime THEN UPDATE t_exam SET EXAM_STATUS = 3 WHERE EXAM_ID = id; END IF; ELSE SELECT NOW() INTO curTime; SELECT EXAM_END_TIME INTO endTime from t_exam WHERE EXAM_ID = id ; IF curTime >= endTime THEN UPDATE t_exam SET EXAM_STATUS = 3 WHERE EXAM_ID = id; END IF; END IF; END LOOP; CLOSE examIds; END
更多相关免费学习推荐:mysql教程(视频)
热心网友 时间:2022-04-07 16:11
在老版本的MySQL3.22中,MySQL的单表限大小为4GB,当时的MySQL的存储引擎还是ISAM存储引擎。但是,当出现MyISAM存储引擎之后,也就是从MySQL3.23开始,MySQL单表最大*就已经扩大到了PB了(官方文档显示)。也就是说,从目前的技术环境来看,MySQL数据库的MyISAM存储引擎单表大小*已经不是有MySQL数据库本身来决定,而是由所在主机的OS上面的文件系统来决定了。而MySQL另外一个最流行的存储引擎之一Innodb存储数据的策略是分为两种的,一种是共享表空间存储方式,还有一种是独享表空间存储方式。当使用共享表空间存储方式的时候,Innodb的所有数据保存在一个单独的表空间里面,而这个表空间可以由很多个文件组成,一个表可以跨多个文件存在,所以其大小*不再是文件大小的*,而是其自身的*。从Innodb的官方文档中可以看到,其表空间的最大*为TB,也就是说,Innodb的单表*基本上也在TB左右了,当然这个大小是包括这个表的所有索引等其他相关数据。而当使用独享表空间来存放Innodb的表的时候,每个表的数据以一个单独的文件来存放,这个时候的单表*,又变成文件系统的大小*了。