mysql存储过程:
车站表:
分区表:
需求:根据每个线路下的每个车站 批量创建分区 一个车站下有64个分区
上代码:
BEGIN
DECLARE Done INT DEFAULT 0;
DECLARE DoneStation INT DEFAULT 0;
DECLARE sLineId VARCHAR(2);
DECLARE sStationId VARCHAR(4);
DECLARE sAreaId VARCHAR(9);
DECLARE sAreaName VARCHAR(50) DEFAULT '';
DECLARE sAreaType VARCHAR(2) default '01';
declare nAreaNum int default 0;
DECLARE i INT default 0;
declare sNo varchar(3);
/*set sAreaType = '01';*/
/* 声明游标 */
DECLARE rs1 CURSOR FOR SELECT TCC_STATION_ID FROM station_info where TCC_LINE_ID = p_lineId;
/* 异常处理 */
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET DoneStation = 1;
/* 打开游标 */
OPEN rs1;
/* 逐个取出当前记录LingQi字段的值,需要进行最大值的判断 */
FETCH NEXT FROM rs1 INTO sStationId;
/* 遍历数据表 */
REPEAT
IF NOT DoneStation THEN
/*select sStationId;
set nAreaNum = 8;*/
set i = 1;
WHILE i<=64
DO
/*set sNo = cast(i as char);*/
if i < 10 THEN
set sAreaId = CONCAT('04', sStationId, '00', CAST(i AS CHAR));
SET sAreaName = CONCAT('分区', '00', CAST(i AS CHAR));
elseif i < 100 THEN
SET sAreaId = CONCAT('04', sStationId, '0', CAST(i AS CHAR));
SET sAreaName = CONCAT('分区', '0', CAST(i AS CHAR));
ELSE
SET sAreaId = CONCAT('04', sStationId, CAST(i AS CHAR));
SET sAreaName = CONCAT('分区', CAST(i AS CHAR));
END IF;
insert into `broadcast_subarea_info`
(`AREA_ID`,
`AREA_NAME`,
`AREA_TYPE`,
`LINE_ID`,
`STATION_ID`,
`BOARD_AREA_NO`)
values(sAreaId, sAreaName, sAreaType, p_lineId, sStationId, i);
SET i = i + 1;
END WHILE;
END IF;
FETCH NEXT FROM rs1 INTO sStationId;
UNTIL DoneStation
END REPEAT;
/* 关闭游标 */
CLOSE rs1;
END
BEGIN
#Routine body goes here...
DECLARE sStationId VARCHAR(5);
DECLARE DoneStation INT DEFAULT 0;
DECLARE rs1 CURSOR FOR SELECT TCC_STATION_ID FROM station_info where TCC_LINE_ID = lineId;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET DoneStation = 1;
OPEN rs1;
insert_loop:LOOP
FETCH NEXT FROM rs1 into sStationId;
IF DoneStation THEN
LEAVE insert_loop;
END IF;
insert into station_test values(sStationId);
END LOOP;
/* 关闭游标 */
CLOSE rs1;
END
xxx:loop 声明一个loop循环 后面end loop结尾
leave xxx 跳出loop
repeat - -end repeat 循环
UNTIL DoneStation 满足什么条件结束repeat
FETCH NEXT FROM rs1 INTO sStationId 逐个取出list 好像是要在until前再调用一次才可以 否则一直插入的都是第一条next