资料上的定义是这个样子的:静态游标是以游标打开时刻的当时状态显示结果集的游标。静态游标在游标打开时不反映对基础数据进行的更新、删除或插入。有时称它们为快照游标。动态游标是可以在游标打开时反映对基础数据进行的修改的游标。用户所做的更新、删除和插入在动态游标中加以反映。问题: 
     1:mysql 支持这两种游标吗:(个人感觉好像只支持动态游标)
     2:静态游标一般用在那种场景。

解决方案 »

  1.   

    做了1个示例:
    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记录清空
      

  2.   


    我测试了下,DECLARE cur1 CURSOR FOR SELECT number FROM aa1;
    或者
    DECLARE cur1 CURSOR FOR SELECT number FROM aa1 for update;
    无论哪种定义方式结果都是:    运行有记录,执行完后AA1记录清空所以, 这个是不是就是所谓静态游标的体现呢?
      

  3.   

    我记得sql server有这个概念 ,关键字是INSENSITIVE其实cursor是一个效率很差的东西,最好不要用。
      

  4.   

    一方面,有些操作不要放在db server上做
    另一方面,尽量用联表的方式替换cursor的操作,批处理和循环效率差很多印象中除了一些测试程序,正式项目里就没用过cursor。
      

  5.   

    DECLARE cur1 CURSOR FOR SELECT number FROM aa1;
    或者
    DECLARE cur1 CURSOR FOR SELECT number FROM aa1 for update;
    无论哪种定义方式结果都是: 运行有记录,执行完后AA1记录清空NO,
    第1种会提示没有记录
    第2种有输出内容两种执行完后AA1记录清空
      

  6.   


    至少我的mysql版本测试结果是这样的
    version: 5.1.30-community-log