MySQL存储过程及游标

来源:互联网 发布:大数据系统硬件 编辑:程序博客网 时间:2024/06/10 11:38

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


我所要做的是将连续地址进行拆分,比如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);#定义越界标签,默认为1DECLARE done INT DEFAULT 1;#定义游标DECLARE getinfo CURSOR FOR SELECT id,road,front,behind,isoddFROM test1;#定义越界,设置标签为0DECLARE 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和“号”的地址传送给testWHILE iid<=rbehind DOINSERT INTO test SELECT rid,concat(rroad,iid,"号");#如果isodd为空,则内部循环每次加1,否则加2IF risodd IS NULL THENSET iid =iid +1;ELSESET iid =iid +2;#结束if判断END IF;#结束内部循环END WHILE;#结束外部循环END WHILE;#关闭游标CLOSE getinfo;#结束存储过程END//delimiter ;CALL proc();


0 0
原创粉丝点击