MySQL游标:深入理解与应用

发表时间: 2024-01-17 14:03

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也会创建临时磁盘表