ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PL/SQL 날짜에 따른 애음주기 쿼리 조회 실습
    SQL/PL. SQL 2020. 2. 25. 20:00

    PL/SQL  날짜에 따른 애음주기 쿼리 조회 실습

    CREATE or REPLACE PROCEDURE create_daily_sales(p_yyyym IN daily.dt%TYPE) IS
    
      --> p_yyyym을 인자(daily.dy 컬럼 타입)로 받는 create_daily_sales이름의 프로시저 생성
    
        TYPE cal_row IS RECORD(  --> dt, d 변수를 가지는 cal_row record 생성
        
            dt VARCHAR2(8),
            
            d NUMBER
            
        );
        
        TYPE cal_tab IS TABLE OF cal_row INDEX BY BINARY_INTEGER;
        
        v_cal_tab cal_tab; --> cal_row의 모든 컬럼의 데이터 타입을 가지는 cal_tab 테이블 타입 생성
        
    BEGIN
    
        SELECT TO_CHAR(TO_DATE(p_yyyym, 'YYYYMM') + (LEVEL-1),'YYYYMMDD') DT, 
        
                TO_CHAR(TO_DATE(p_yyyym || '01', 'YYYYMMDD') + (LEVEL-1), 'D') D
                
                BULK COLLECT INTO v_cal_tab 
                
        FROM dual
        
        CONNECT BY LEVEL <= TO_CHAR(LAST_DAY(TO_DATE(p_yyyym || '01', 'YYYYMMDD')),'DD');
      
        DELETE daily   --> 일실적 데이터를 생성하기 전에 기존에 생성된 데이터를 삭제
        
        WHERE dt LIKE P_yyyym || '%';
       
        -- 애음주기 정보를 조회(FOR-Cursor)
        
        FOR daily_row IN (SELECT * FROM cycle) LOOP --> FOR LOOP문 사용
        
            -> daily_row라는 루프변수에 SELECT* FROM cycle 결과 값 넣기
        
            DBMS_OUTPUT.PUT_LINE(daily_row.cid || ' ' || daily_row.pid || ' ' || daily_row.day || ' ' || daily_row.cnt);
            
            --> 출력문으로 모든 결과 찍어주기
            
            FOR i IN 1..v_cal_tab.COUNT LOOP  --> i가 1부터 v_cal_tab의 전체 행의 수만큼 LOOP문이 돈다
                
                -- outer LOOP (애음주기)에서 읽은 요일이랑 inner loop(달력)에서 읽은 요일이 같은 데이터를 체크
                
                    IF daily_row.day = v_cal_tab(i).d THEN 
                    
                    --> 첫번째로 실행될 때 daily_row.day결과의 첫행 = v_cal_tab(1).d 가 같으면~~
                    
                    INSERT INTO daily VALUES (daily_row.cid, daily_row.pid, v_cal_tab(i).dt, daily_row.cnt);
                    
                    --> insert문을 실행해라~
                    
                    DBMS_OUTPUT.PUT_LINE(v_cal_tab(i).dt || ' ' || v_cal_tab(i).d);
                    
                    END IF;
                    
                END LOOP;
                
        END LOOP;
        
        COMMIT;
        
    END;
    /

     

    위의 쿼리를 원쿼리로 작성

     

    INSERT INTO daily
    
    SELECT cycle.cid, cycle.pid, cal.dt, cycle.cnt
    
    FROM cycle,
    
        (SELECT TO_CHAR(TO_DATE('202002', 'YYYYMM') + (LEVEL-1),'YYYYMMDD')dt,
        
                TO_CHAR(TO_DATE('202002', 'YYYYMM') + (LEVEL-1),'D')d
                
        FROM dual
        
        CONNECT BY LEVEL <= TO_CHAR(LAST_DAY(TO_DATE('202002', 'YYYYMM') ),'DD')) cal
        
    WHERE cycle.day = cal.d;

    'SQL > PL. SQL' 카테고리의 다른 글

    PL/SQL FUNCTION  (0) 2020.02.25
    PL/SQL 예외처리(EXCEPTION)  (0) 2020.02.25
    커서 ( Cursor )  (0) 2020.02.24
    PL/SQL IF문, CASE문 FOR LOOP문  (0) 2020.02.24
    PL/SQL 실습  (0) 2020.02.23

    댓글

Designed by Tistory.