资料上的定义是这个样子的:静态游标是以游标打开时刻的当时状态显示结果集的游标。静态游标在游标打开时不反映对基础数据进行的更新、删除或插入。有时称它们为快照游标。动态游标是可以在游标打开时反映对基础数据进行的修改的游标。用户所做的更新、删除和插入在动态游标中加以反映。问题:
1:mysql 支持这两种游标吗:(个人感觉好像只支持动态游标)
2:静态游标一般用在那种场景。
1:mysql 支持这两种游标吗:(个人感觉好像只支持动态游标)
2:静态游标一般用在那种场景。
DELIMITER $$USE `aa1`$$DROP PROCEDURE IF EXISTS `dd`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `dd`()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE zz INT DEFAULT 0;
DECLARE cur1 CURSOR FOR SELECT number FROM aa1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
TRUNCATE aa1;
FETCH cur1 INTO zz;
WHILE done=0 DO
SELECT zz;
FETCH cur1 INTO zz;
END WHILE;
END$$DELIMITER ;运行提示没有记录DECLARE cur1 CURSOR FOR SELECT number FROM aa1 for update;
运行有记录,执行完后AA1记录清空
我测试了下,DECLARE cur1 CURSOR FOR SELECT number FROM aa1;
或者
DECLARE cur1 CURSOR FOR SELECT number FROM aa1 for update;
无论哪种定义方式结果都是: 运行有记录,执行完后AA1记录清空所以, 这个是不是就是所谓静态游标的体现呢?
另一方面,尽量用联表的方式替换cursor的操作,批处理和循环效率差很多印象中除了一些测试程序,正式项目里就没用过cursor。
或者
DECLARE cur1 CURSOR FOR SELECT number FROM aa1 for update;
无论哪种定义方式结果都是: 运行有记录,执行完后AA1记录清空NO,
第1种会提示没有记录
第2种有输出内容两种执行完后AA1记录清空
至少我的mysql版本测试结果是这样的
version: 5.1.30-community-log