MySql 存儲過程插入年月日

參數:開始年份,結束年份
過程說明:生成年月數據插入期間有中,若發現已經存在某年的數據則跳過。

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 ;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章