-
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