CREATE OR REPLACE PROCEDURE INPUT_DATE(NEW_DATE VARCHAR) --YYYYMMDD VARCHAR AS D_DATE DATE; V_SQL VARCHAR2(200); --VAR_DATE VARCHAR2(10) BEGIN D_DATE := TO_DATE(NEW_DATE,'YYYYMMDD'); --日期格式 --VAR_DATE = TO_CHAR(D_DATE,'YYYYMMDD') --字符串格式 V_SQL := 'INSERT INTO YSY_TEST SELECT :i,D_DATE,:PINDU FROM TABLE_NAME WHERE MODIFY_DATE>= :STARTDATE AND MODIFY_DATE <= :VAR_DATE'; FOR I IN 1..5 LOOP IF I = 1 AND D_DATE = TO_CHAR(LAST_DAY(D_DATE),'YYYYMMDD') then --判断D_DATE是否为月末最后一天 START_DATE := TO_CHAR(TRUNC(D_DATE,'MM'),'YYYYMMDD');--本月初 EXECUTE IMMEDIATE V_SQL USING i,D_DATE,START_DATE,D_DATE; COMMIT; ELSE IF I = 2 AND MOD(TO_NUMBER(TO_CHAR(D_DATE,'MM')),3) = 0 --判断D_DATE是否为3、6、9、12 AND D_DATE = ADD_MONTHS(TRUNC(D_DATE,'Q'),3)-1 THEN --判断D_DATE是否为季的最后一天 START_DATE := TRUNC(D_DATE,'Q'); --季初 EXECUTE IMMEDIATE V_SQL USING i,NEW_DATE,START_DATE,D_DATE; COMMIT; ELSE IF I = 3 AND TO_CHAR(D_DATE,'MM') <'07' --判断是否为上半年 AND NEW_DATE = ADD_MONTHS(TRUNC(D_DATE,'YYYY'),6)-1 THEN --判断是否为上半年最后一天 START_DATE := TRUNC(D_DATE,'YYYY'); --上半年初 EXECUTE IMMEDIATE V_SQL USING i,D_DATE,START_DATE,D_DATE; COMMIT; ELSE IF I = 4 AND TO_CHAR(D_DATE, 'MM') > '06' --判断是否为下半年 AND NEW_DATE = ADD_MONTHS(TRUNC(D_DATE,'YYYY'),12)-1 THEN --判断是否为下半年最后一天 START_DATE := ADD_MONTHS(TRUNC(D_DATE,'YYYY'),6); --下半年初 EXECUTE IMMEDIATE V_SQL USING i,D_DATE,START_DATE,D_DATE; COMMIT; ELSE IF I = 5 AND NEW_DATE = ADD_MONTHS(TRUNC(D_DATE,'YYYY'),12)-1 THEN --判断是否为年末最后一天 START_DATE := TRUNC(D_DATE,'YYYY'); --年初 EXECUTE IMMEDIATE V_SQL USING i,D_DATE,START_DATE,D_DATE; COMMIT; END IF; END LOOP; END INPUT_DATE;