♣ Tech & Biz Salon/Tech

연속된 숫자 레코드별 반환, 1년치 날짜 레코드별 반환 쿼리, 달력데이터 생성 SP

TasteGod 2009. 12. 1. 09:03
SELECT TO_DATE(LEVEL, 'DDD')
FROM DUAL
CONNECT BY LEVEL<=365

쿼리를 할때 기존 지식 응용도 하고, 찾아도 보면서, 가능하면 한방에 할 수 있도록 노력하자 !

예전에 만들었던  달력데이터 생성 SP는 위의 쿼리에 비해 무식이 흐르는도다

CREATE OR REPLACE PROCEDURE
SP_JEETA_HDAY_YEARDAY_MAKE
(
    P_YEAR IN VARCHAR2
)
/**
*************************************
P_YEAR 에 특정년도를 넘기면, 해당 년도의 1년치 날짜를 생성함
*************************************
*/
IS

EXP0 EXCEPTION;
SQL_ERR_CD    VARCHAR2(80);

V_FROM DATE := TO_DATE(P_YEAR || '0101','YYYYMMDD');
V_TO DATE := TO_DATE(P_YEAR || '1231','YYYYMMDD');
V_LP_DATE DATE;
V_LP_CHAR VARCHAR2(8);

BEGIN

    BEGIN
   
        DELETE FROM HDAY_YEARDAY
        WHERE YRDY_YEAR = P_YEAR;
       
        EXCEPTION WHEN OTHERS THEN
            RAISE EXP0;
       
    END;
   
    V_LP_DATE := V_FROM;
   
    WHILE V_LP_DATE < V_TO + 1
    LOOP

        V_LP_CHAR := TO_CHAR(V_LP_DATE, 'YYYYMMDD');
        BEGIN
       
            INSERT INTO HDAY_YEARDAY
            (
                YRDY_YEAR
                ,YRDY_DATE
                ,YRDY_CHAR
                ,OFFX_YSNO
            )
            VALUES
            (
                P_YEAR
                ,V_LP_DATE
                ,V_LP_CHAR
                ,CASE
                    WHEN TO_CHAR(V_LP_DATE, 'D') IN ('1','7')
                        THEN 1
                    ELSE 0
                    END
            );
           
            EXCEPTION WHEN OTHERS THEN
                RAISE EXP0;
       
        END;       
        V_LP_DATE := V_LP_DATE + 1;

    END LOOP;
   
    COMMIT;
   
    EXCEPTION
   
        WHEN EXP0 THEN
            DBMS_OUTPUT.PUT_LINE('SQLCODE : '|| SQLCODE );
             DBMS_OUTPUT.PUT_LINE('SQLERRM : '|| SQLERRM );
             ROLLBACK;
           
END;

'♣ Tech & Biz Salon > Tech' 카테고리의 다른 글

connect by ~ order siblings by~  (0) 2009.12.03
GRANT, SYNONYM 문 추출하기  (0) 2009.11.24
tnsname.ora 세팅없이 DBLINK 생성하기  (0) 2009.10.21