首 页 行业热点 新车 试驾评测 养车用车 车型库

mysql存储过程从表的第二条记录开始遍历,怎么使用游标?

发布网友 发布时间: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的表的时候,每个表的数据以一个单独的文件来存放,这个时候的单表*,又变成文件系统的大小*了。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com