mysql存储过程:

车站表:

mysql存储过程实例

分区表:

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

相关文章: