您的位置:首页 > 数据库 > MySQL

MySQL存储过程及游标

2016-05-31 09:48 441 查看
上个星期风风火火地学了下存储过程及游标,发现有一些细节容易忽略,在此做出一些标注,也希望能够给学习的人一些指导。

我所要做的是将连续地址进行拆分,比如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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: