基本表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 ('', '张三', '', '北京', '沈阳');
INSERT INTO `temp` VALUES ('', '张三', '', '沈阳', '哈尔滨');
INSERT INTO `temp` VALUES ('', '李四', '', '保定', '天津');
INSERT INTO `temp` VALUES ('', '李四', '', '天津', '东莞');
INSERT INTO `temp` VALUES ('', '李四', '', '东莞', '广州');
INSERT INTO `temp` VALUES ('', '王五', '', '保定', '石家庄');
INSERT INTO `temp` VALUES ('', '王五', '', '石家庄', '宁晋');

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

物流司机可能是 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 ('', '张三', '', '北京', '哈尔滨');
INSERT INTO `temp1` VALUES ('', '李四', '', '保定', '广州');
INSERT INTO `temp1` VALUES ('', '王五', '', '保定', '宁晋');

遇到的问题:

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

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

SET done = 0;

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

2、游标嵌套后需要加

begin……end;

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

mysql 存储过程 游标嵌套的更多相关文章

  1. MySQL存储过程 游标

    MySQL存储过程  游标 如何在存储过程中使用MySQL游标来遍历SELECT语句返回的结果集 MySQL游标简介 要处理存储过程中的结果集,请使用游标.游标允许您迭代查询返回的一组行,并相应地处理 ...

  2. mysql存储过程游标嵌套循环

    自己写的一个mysql存储过程如下: BEGIN DECLARE _did bigint(20);DECLARE _count int;DECLARE s1 int;DECLARE cur_1 CUR ...

  3. MySQL 存储过程/游标/事务

    将会用到的几个表 mysql> DESC products; +------------+--------------+------+-----+---------+-------------- ...

  4. php调用mysql存储过程游标

    <?php $dbtype = 'mysql'; $host = 'localhost'; $dbname = 'test'; $dsn = "$dbtype:host=$host;d ...

  5. mysql存储过程游标加计划任务事件调度器

    存储过程加事件调度器 -- 存储过程 (多个)游标的使用 临时表的使用(让执行时间从一个小时降低到5分钟)DELIMITER $$ DROP PROCEDURE IF EXISTS `eval_cal ...

  6. mysql 多重游标嵌套

    1.DECLARE CONTINUE HANDLER FOR NOT FOUND 在mysql的存储过程中经常会看到这句话:DECLARE CONTINUE HANDLER FOR NOT FOUND ...

  7. MySQL 存储过程游标

    一.创建游标 游标用declare语句创建.如下面的例子所示: create procedure test2() begin declare cursorTest cursor for select ...

  8. mysql存储过程 --游标的使用 取每行记录 (多字段)

    delimiter $ create PROCEDURE phoneDeal() BEGIN DECLARE id varchar(64); -- id DECLARE phone1 varchar( ...

  9. mysql 存储过程 -- 游标的使用(备忘)

    BEGIN ; DECLARE f_ratio FLOAT DEFAULT 0.8; ); ); DECLARE i_statDate DATE; DECLARE i_accumulateCount ...

随机推荐

  1. 【转】【MySQL】时间类型存储格式选择

    一  前言  昨天在给开发同学做数据库设计规范分享的时候,讲到时间字段常用的有三个选择datetime.timestamp.int,应该使用什么类型的合适?本文通过三种类型的各个维度来分析,声明:本文 ...

  2. Yii2 数据库查询汇总

    1.基础查询 User::find()->all(); 此方法返回所有数据: User::findOne($id); 此方法返回 主键 id=1 的一条数据(举个例子): User::find( ...

  3. 1-10假期训练(hdu-2059 简单dp)

    题目一:传送门 思路:水题,模拟即可 题目二:传送门 思路:dp,决策每个充电站是否要充电.(决策只有搜索,DP两种解决方法) (1)考虑状态的个数,n+2个,因为除了n个还有位置0,终点len两种状 ...

  4. 解决Oracle+Mybatis批量插入报错:SQL 命令未正确结束

    Mybatis批量插入需要foreach元素.foreach元素有以下主要属性: (1)item:集合中每一个元素进行迭代时的别名. (2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的 ...

  5. [转载]使用PHP_CodeSniffer规范php代码

    为什么使用PHP_CodeSniffer 一个开发团队统一的编码风格,有助于他人对代码的理解和维护,对于大项目来说尤其重要. PHP_CodeSniffer是PEAR中的一个用PHP5写的用来检查嗅探 ...

  6. Ubuntu 16.04 搭建LAMP服务器环境流程

    http://www.linuxidc.com/Linux/2016-09/135629.htm [安装mysql时 只需安装 mysql-server无需安装mysql-client] mysql ...

  7. EXCEL中R1C1样式引用

    主要引用http://club.excelhome.net/thread-759847-1-1.html Sub chengji() ' ' 宏1 宏 ' Dim Finalrow As Intege ...

  8. Gibs抽样

    /* * Copyright (C) 2007 by * * Xuan-Hieu Phan * hieuxuan@ecei.tohoku.ac.jp or pxhieu@gmail.com * Gra ...

  9. GIS矢量数据化简:一种改进的道格拉斯-普克算法以及C++实现

    GIS领域的同志都知道,传统的道格拉斯-普克算法都是递归实现.然而有时候递归的层次太深的话会出现栈溢出的情况.在此,介绍一种非递归的算法. 要将递归算法改为非递归算法,一般情况下分为两种场景.第一种是 ...

  10. Page页面生命周期——微信小程序

    onLoad:function (options) {     //页面初始化     console.log('index Load') }, onShow:function () {     // ...