参数:开始年份,结束年份
过程说明:生成年月数据插入期间有中,若发现已经存在某年的数据则跳过。

DROP PROCEDURE IF EXISTS createPayPeriod;
DELIMITER //
CREATE PROCEDURE createPayPeriod(IN START_YEAR INT,IN END_YEAR int)
BEGIN
DECLARE v int;

declare max_year int;

DECLARE c INT;
set v=START_YEAR;
set max_year = END_YEAR;
LOOP_LABLE:LOOP
IF v<=END_YEAR THEN
select count(1) into c from pay_period t where t.period_year = v;
if c>0 then
SET v=v+1;
ITERATE LOOP_LABLE;
end if;
INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-01'),v,'01');
INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-02'),v,'02');
INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-03'),v,'03');
INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-04'),v,'04');
INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-05'),v,'05');
INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-06'),v,'06');
INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-07'),v,'07');
INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-08'),v,'08');
INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-09'),v,'09');
INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-10'),v,'10');
INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-11'),v,'11');
INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-12'),v,'12');


SET v=v+1;
ITERATE LOOP_LABLE;
END IF;
IF v>END_YEAR THEN
LEAVE LOOP_LABLE;
END IF;
END LOOP;


END ;
//
DELIMITER ;

在navicat中执行存储过程



SET @start_year = 2020;

set @end_year = 2100;

CALL createPayPeriod (@start_year ,@end_year);

改进版

DROP PROCEDURE IF EXISTS createPayPeriod2;
DELIMITER //
CREATE PROCEDURE createPayPeriod2(IN START_YEAR INT,IN END_YEAR int)
BEGIN
DECLARE v int;

declare max_year int;
declare v_month int;
DECLARE s_month varchar(7);
DECLARE c INT;
set v=START_YEAR;
set max_year = END_YEAR;
LOOP_LABLE:LOOP
IF v<=END_YEAR THEN
set v_month = 1;

LOOP_LABLE2: LOOP
IF v_month <= 12 THEN
select count(1) into c from pay_period t where t.period_year = v AND t.period_month = v_month;
if c>0 THEN
SET v_month=v_month+1;
ITERATE LOOP_LABLE2;
END IF;
select concat(v,'-',v_month) into s_month;
if v_month < 10 THEN
select concat(v,'-0',v_month) into s_month;
END IF;

INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,s_month,v,v_month);

SET v_month=v_month+1;
ITERATE LOOP_LABLE2;
END IF;
IF v_month > 12 THEN
LEAVE LOOP_LABLE2;
END IF;
END LOOP;


SET v=v+1;
ITERATE LOOP_LABLE;
END IF;
IF v>END_YEAR THEN
LEAVE LOOP_LABLE;
END IF;
END LOOP;


END ;
//
DELIMITER ;

更多相关文章

  1. SQLServer---查询过程中的数据类型转化
  2. 关于使用框架操作Oracle数据库切换MySQL数据库时,nextval的问题!
  3. linux ,cron定时任务 备份mysql数据库
  4. 为什么数据库设计人员不让标识列从最小值开始而不是从1开始?
  5. 如何优化用于从表复制数据的oracle过程?
  6. 入门 --ubuntu下面mysql数据库安装以及相关操作
  7. 使用python抓取csdn博客访问量并保存在sqlite3数据库中
  8. 世界国家 的数据库sql
  9. 在C#.net的server explorer 上建立的数据库,在sql server managem

随机推荐

  1. c语言源程序的基本单位是什么
  2. c语言system函数用法
  3. c++源程序文件的扩展名是什么
  4. 一个c语言程序由什么组成
  5. vb.net和vb的区别是什么?
  6. c语言可以直接对硬件进行操作吗
  7. 汇编语言和c语言之间有什么区别?
  8. 对c语言的了解和认识
  9. c语言double类型默认输出几位小数?
  10. int main和void main的区别