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 ('', '张三', '', '北京', '沈阳');
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 存储过程 游标嵌套的更多相关文章
- MySQL存储过程 游标
MySQL存储过程 游标 如何在存储过程中使用MySQL游标来遍历SELECT语句返回的结果集 MySQL游标简介 要处理存储过程中的结果集,请使用游标.游标允许您迭代查询返回的一组行,并相应地处理 ...
- mysql存储过程游标嵌套循环
自己写的一个mysql存储过程如下: BEGIN DECLARE _did bigint(20);DECLARE _count int;DECLARE s1 int;DECLARE cur_1 CUR ...
- MySQL 存储过程/游标/事务
将会用到的几个表 mysql> DESC products; +------------+--------------+------+-----+---------+-------------- ...
- php调用mysql存储过程游标
<?php $dbtype = 'mysql'; $host = 'localhost'; $dbname = 'test'; $dsn = "$dbtype:host=$host;d ...
- mysql存储过程游标加计划任务事件调度器
存储过程加事件调度器 -- 存储过程 (多个)游标的使用 临时表的使用(让执行时间从一个小时降低到5分钟)DELIMITER $$ DROP PROCEDURE IF EXISTS `eval_cal ...
- mysql 多重游标嵌套
1.DECLARE CONTINUE HANDLER FOR NOT FOUND 在mysql的存储过程中经常会看到这句话:DECLARE CONTINUE HANDLER FOR NOT FOUND ...
- MySQL 存储过程游标
一.创建游标 游标用declare语句创建.如下面的例子所示: create procedure test2() begin declare cursorTest cursor for select ...
- mysql存储过程 --游标的使用 取每行记录 (多字段)
delimiter $ create PROCEDURE phoneDeal() BEGIN DECLARE id varchar(64); -- id DECLARE phone1 varchar( ...
- mysql 存储过程 -- 游标的使用(备忘)
BEGIN ; DECLARE f_ratio FLOAT DEFAULT 0.8; ); ); DECLARE i_statDate DATE; DECLARE i_accumulateCount ...
随机推荐
- linux_开启mysql服务
想要连接mysql的时候必须先开启mysql的服务 service mysqld start mysql -u root -p 输入密码
- 使用kbmmw smart service 属性时的一个注意事项
kbmmw 5.0 以后支持smart service, 这个用起来非常方便,kbmmw 通过 定制属性来简化编程,可以参考我以前的文章.但是这个意味着使用单元引用一定要小心, 否则出了问题,都不知道 ...
- vue组件实现查看大图效果
使用的index.vue代码 <template> <img :src="imgUrl" @click="clickImg($event)"& ...
- C# AOP框架入门(转)
出处:https://www.cnblogs.com/isaboy/p/Csharp_AOP_Log.html AOP面向切面编程(Aspect Oriented Programming),是通过预编 ...
- php Amome框架 层次设计备注
层次说明: 每一级中函数都是为而且只为 上(高)一层 的文件服务的 最底层: AmemoMySql 基础数据库函数:AmemoConfig 数据库信息配置文件 再高一层: 一个文件对应一个 ...
- 实战fortran77基础语法
1.数组在主函数和子例行函数中传递 一个项目中有两个源代码文件: 代码: PROGRAM ARRAYZBL DOUBLE PRECISION A,B,C,D(:) INTEGER I DATA A,B ...
- mysql学习之路_sql
查看数据库: Show databases; 查看指定部分数据库:模糊查询 Show databases like ‘patten’;--paatten是匹配模式 %:表示是匹配模式 _:表示匹配单个 ...
- django调用py报错 django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured.
完整报错信息如下 django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, bu ...
- 反射List<M> To DataTable|反射IList To DataTable|反射 DataTable To List<M>
将DataTable集合反射获取 List<M> /// <summary> /// 根据DataTable集合反射获取 List<M> /// </summ ...
- jquery取消事件冒泡的三种方法展示
jquery取消事件冒泡的三种方法展示 html代码 <!doctype html> <html> <head> <meta charset="ut ...