MySQL存储过程及游标
2016-05-31 09:48
441 查看
上个星期风风火火地学了下存储过程及游标,发现有一些细节容易忽略,在此做出一些标注,也希望能够给学习的人一些指导。
我所要做的是将连续地址进行拆分,比如address“环庆中路321弄1-30号”,目标是将其拆成“环庆中路321弄1号”,“环庆中路321弄2号”,“环庆中路321弄3号”等等。首先我将地址拆分为road“环庆中路321弄”,front“1”,behind“30”几个片段。然后建立一张新表,进行循环插入,过程如下。
我所要做的是将连续地址进行拆分,比如address“环庆中路321弄1-30号”,目标是将其拆成“环庆中路321弄1号”,“环庆中路321弄2号”,“环庆中路321弄3号”等等。首先我将地址拆分为road“环庆中路321弄”,front“1”,behind“30”几个片段。然后建立一张新表,进行循环插入,过程如下。
#原表如下 #id road front behind isodd #1 爱特路185弄 1 30 NULL #2 长宁路 255 259 Y #创建循环插入的表 drop table if exists test; CREATE table test(id int,address varchar(255)); #创建存储过程 DROP PROCEDURE IF EXISTS proc; DELIMITER // CREATE PROCEDURE proc() #declare必须放在begin和end之间 BEGIN #内置循环标签 DECLARE inid INT DEFAULT 1; #外部循环标签 DECLARE iid INT DEFAULT 0; #isodd为是否单数,“是”为“Y”,"否"为“NULL”,定义变量 DECLARE rid VARCHAR(255); DECLARE rroad VARCHAR(255); DECLARE rfront INT; DECLARE rbehind INT; DECLARE risodd varchar(255); #定义越界标签,默认为1 DECLARE done INT DEFAULT 1; #定义游标 DECLARE getinfo CURSOR FOR SELECT id,road,front,behind,isoddFROM test1; #定义越界,设置标签为0 DECLARE exit HANDLER FOR NOT FOUND SET done = 0; #打开游标 OPEN getinfo; #当越界标签为默认1时一直循环,或者可以利用repeat先循环再判断,两种循环没有多大差别 WHILE done = 1 DO #将游标获取的值放进定义的变量当中 FETCH getinfo INTO rid,rroad,rfront,rbehind,risodd; #外部循环每次增加,会把front赋值给iid,利用iid进行内部循环 SET inid =inid +1; SELECT rfront INTO iid; #当iid<behind时开始内部循环,将id,拼接road和iid和“号”的地址传送给test WHILE iid<=rbehind DO INSERT INTO test SELECT rid,concat(rroad,iid,"号"); #如果isodd为空,则内部循环每次加1,否则加2 IF risodd IS NULL THEN SET iid =iid +1; ELSE SET iid =iid +2; #结束if判断 END IF; #结束内部循环 END WHILE; #结束外部循环 END WHILE; #关闭游标 CLOSE getinfo; #结束存储过程 END// delimiter ; CALL proc();
相关文章推荐
- mysql导入sql脚本文件的正确姿势
- mysql.sock文件丢失
- 使用PDO查询mysql避免SQL注入
- 解决Mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost'问题
- MYSQL 索引
- PHP表单数据写入MySQL数据库的代码
- mysql查看版本
- MySQL创建数据库的两种方法
- 关于MYSQL安装时, start service失败解决
- MySQL触发器
- PHP表单数据写入MySQL代码
- Mysql 两大常用的存储引擎MyISAM,InnoDB的六大常见区别
- MySQL主从同步报错排错结果及修复过程之:Slave_SQL_Running: No
- MySQL 对于千万级的大表要怎么优化? - MySQL - 知乎
- mysql优化之insert/delete/update
- mysql大表更新sql的优化策略
- MySQL 性能优化的最佳20多条经验分享
- MYSQL优化原则
- 【数据库之mysql】 mysql 入门教程(二)
- 【数据库之mysql】mysql的安装(一)