zoukankan      html  css  js  c++  java
  • mysql 存储过程 游标嵌套

    基本表temp

    包括 name, type, sendCity, getCity

    分别对应物流送货司机名, 倒车的第几段, 发货城市, 收货城市

    表结构

    -- ----------------------------
    -- Table structure for `temp`
    -- ----------------------------
    DROP TABLE IF EXISTS `temp`;
    CREATE TABLE `temp` (
      `id` int(16) NOT NULL AUTO_INCREMENT,
      `name` varchar(32) DEFAULT NULL,
      `type` varchar(32) DEFAULT NULL,
      `sendCity` varchar(32) DEFAULT NULL,
      `getCity` varchar(32) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of temp
    -- ----------------------------
    INSERT INTO `temp` VALUES ('7', '张三', '2', '北京', '沈阳');
    INSERT INTO `temp` VALUES ('8', '张三', '3', '沈阳', '哈尔滨');
    INSERT INTO `temp` VALUES ('9', '李四', '1', '保定', '天津');
    INSERT INTO `temp` VALUES ('10', '李四', '2', '天津', '东莞');
    INSERT INTO `temp` VALUES ('11', '李四', '3', '东莞', '广州');
    INSERT INTO `temp` VALUES ('12', '王五', '1', '保定', '石家庄');
    INSERT INTO `temp` VALUES ('13', '王五', '2', '石家庄', '宁晋');

    这里是分段的,需要将姓名是“张三” 的第二,第三段合成一个 记录,也就是  “张三”   “北京” “哈尔滨”

    物流司机可能是 1,2段,可能是1,2,3段,可能是2,3段所以在这里写一个存储过程,将合并后的结果放到另一个表中,

    存储过程用到双游标嵌套,仅做记录

    BEGIN
        
      DECLARE done INT DEFAULT 0; 
        DECLARE _name varchar(64);
        declare _maxType varchar(32);
        declare _minType varchar(32);
    
        declare _type varchar(64);
        declare _sendCity varchar(64);    
        declare _getCity varchar(64);
    
        #declare _tempName varchar(64);
        declare _tempSend varchar(64);
        declare _tempGet varchar(64);
        
        DECLARE cursorOuter CURSOR for select name, max(type) maxType, min(type) minType from temp group by name;    
                        DECLARE cursorInner CURSOR for select type, sendCity, getCity from temp where name=_name;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;   #循环终止的标志,游标中如果没有数据就设置done为1
    
                    #select now();
        OPEN cursorOuter;
        FETCH cursorOuter INTO _name, _maxType, _minType;  
        WHILE (done=0) DO  
    
                    begin
                        open cursorInner;
                        fetch cursorInner into _type, _sendCity, _getCity;
    
                        while (done=0) DO
                            if _type = _maxType then 
                                set _tempGet = _getCity;
                            elseif _type = _minType then 
                                set _tempSend = _sendCity;
                            end if;
                            FETCH cursorInner into _type, _sendCity, _getCity;
                        end while;
                        
                        close cursorInner;
                    end;
    
                    INSERT into temp1(name, type, sendCity, getCity) values(_name, _type, _tempSend, _tempGet);
    
                    SET done = 0;
            ## 赋值下一个游标  
            FETCH cursorOuter INTO _name, _maxType, _minType;  
        END WHILE;  
        
        ## 关闭  
        CLOSE cursorOuter;  
    END

    最后的 temp1 表结构和数据是这样的:

    -- ----------------------------
    -- Table structure for `temp1`
    -- ----------------------------
    DROP TABLE IF EXISTS `temp1`;
    CREATE TABLE `temp1` (
      `id` int(16) NOT NULL AUTO_INCREMENT,
      `name` varchar(32) DEFAULT NULL,
      `type` varchar(32) DEFAULT NULL,
      `sendCity` varchar(32) DEFAULT NULL,
      `getCity` varchar(32) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of temp1
    -- ----------------------------
    INSERT INTO `temp1` VALUES ('19', '张三', '3', '北京', '哈尔滨');
    INSERT INTO `temp1` VALUES ('20', '李四', '3', '保定', '广州');
    INSERT INTO `temp1` VALUES ('21', '王五', '2', '保定', '宁晋');

    遇到的问题:

    1、存储过成总是提示 nodata,查询后 添加


    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; #循环终止的标志,游标中如果没有数据就设置done为1


    SET done = 0;

    while循环以WHILE (done=0) DO  作为判断。

    2、游标嵌套后需要加

    begin……end;

    内层循环是包含在其中的;

  • 相关阅读:
    天轰穿C# vs2010 04面向对象的编程之隐藏基类方法【原创】
    学云网助阵软博会 云教育平台备受关注
    天轰穿C# vs2010 04面向对象的编程之多态【原创】
    编程可以如此简单 学云网校园技术之旅
    天轰穿C# vs2010 04面向对象的编程之重载运算符【原创】
    天轰穿C# vs2010 04面向对象的编程之虚成员和重写【原创】
    天轰穿C# vs2010 04面向对象的编程之抽象类和抽象方法【原创】
    直播:1996年—2012年,哥从农民到清华大学出书的奋斗史
    天轰穿C# vs2010 04面向对象的编程之运算符重载的示例【原创】
    .天轰穿C# vs2010 04面向对象的编程之接口 VS 抽象类 【原创】
  • 原文地址:https://www.cnblogs.com/PPBoy/p/8998364.html
Copyright © 2011-2022 走看看