1、mysql在服务器端提供只读、单向的游标
2、游标只能在存储过程或更底层的客户端中使用
DROP PROCEDURE if EXISTS insert_item;DELIMITER $$CREATEPROCEDURE insert_item()BEGINDECLARE c_id VARCHAR(32);DECLARE i INT DEFAULT 0;DECLARE c_name VARCHAR(32);DECLARE done INT DEFAULT FALSE;DECLARE cur CURSOR FOR SELECT id FROM type WHERE name IS NOT NULL;DECLARE CONTINUE HANDLER FOR NOT found SET done=TRUE;SET @names="11,12,13,14,15,16,17,18,19,20,21,22";OPEN cur;insert_loop: LOOPFETCH next FROM cur INTO c_id;IF done THEN LEAVE insert_loop;END IF;SET i=1;WHILE i<=12 DOSET c_name=SUBSTRING_INDEX(SUBSTRING_INDEX(@names,',',i),',',-1);INSERT INTO type_extension(`typeID`,`name`,`creationdate`,`modifydate`,`sort`,`group`,`status`) VALUES(c_id,c_name,'2024-01-17 11:01:00','2024-01-17 11:01:00',UNIX_TIMESTAMP(NOW()),'a',1);SET i=i+1;END WHILE;END LOOP;CLOSE cur;END $$DELIMITER;CALL insert_item();DROP PROCEDURE if EXISTS insert_item;
1' DECLARE cur CURSOR FOR SELECT id FROM type WHERE name IS NOT NULL;
DECLARE CONTINUE HANDLER FOR NOT found SET done=TRUE;
声明游标,设置游标结束符done
2' 功能:从type表中找到需要插入的id,分别将id-name对插入表中。
3' SELECT SUBSTRING_INDEX('11,12,13,14,15,16,17,18,19,20,21,22',',',3);
从左侧起取第3个逗号【,】前数据
SELECT SUBSTRING_INDEX('11,12,13,14,15,16,17,18,19,20,21,22',',',-1);
从右侧起取第3个逗号【,】前数据
SELECTSUBSTRING_INDEX(SUBSTRING_INDEX('11,12,13,14,15,16,17,18,19,20,21,22',',',12),',',-1)
从左侧起取第12个逗号【,】前数据,从右侧起取第1个逗号【,】前数据
3、游标中指向的对象都是存储在临时表中而不是实际的查询数据中(只读)
4、游标会让mysql执行一些额外的I/O操作:
1' 临时表中不支持BLOB/TEXT类型,如果游标中返回结果包含BLOB/TEXT类型列,mysql会创建临时磁盘表来存放结果。
2' 当临时表大小>tmp_table_size时,mysql也会创建临时磁盘表