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=14DEFAULT 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 DEFAULT0;
DECLARE _name varchar(64);
declare _maxType varchar(32);
declare _minType varchar(32);
declare _type varchar(64);
declare _sendCity varchar(64);
declare _getCity varchar(64);mysql视图和存储过程
#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=22DEFAULT 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;
内层循环是包含在其中的;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论