테이블에 데이타를 반복적으로 저장시켜야 하는데요..
저장되야하는 데이타는 아래 표와같은 형태로 저장되어야 합니다.
A | 201401 | 1 | 작업1 | 관리자 | SYSDATE |
A | 201401 | 2 | 작업2 | 관리자 | SYSDATE |
A | 201401 | 3 | 작업3 | 관리자 | SYSDATE |
A | 201401 | 4 | 작업4 | 관리자 | SYSDATE |
A | 201401 | 5 | 작업5 | 관리자 | SYSDATE |
A라는 업무가 2014년1월에 작업1~ 작업5까지 수행했다는 이력을 관리하는 테이블인데
이력테이블이 나중에 추가되다보니 과거데이타에 대한 이력을 insert하는 작업을 해야합니다
한 업무가 수행하는 작업은 5개로 고정이고 년월만 변경되어 작업 별로 저장되면 됩니다.
저런식으로 구성된 데이타를 일괄로 insert할 때 좋은 방법이 어떤게 있는지 의견부탁드립니다.
SELECT A1, TO_CHAR(ADD_MONTHS(TO_DATE(A2,'YYYYMM'),RN-1),'YYYYMM') A2, A3, A4, A5, A6 FROM ( SELECT 'A' A1, '201401' A2, 1 A3, '작업1' A4, '관리자' A5, SYSDATE A6 FROM DUAL UNION ALL SELECT 'A', '201401', 2, '작업2', '관리자', SYSDATE FROM DUAL UNION ALL SELECT 'A', '201401', 3, '작업3', '관리자', SYSDATE FROM DUAL UNION ALL SELECT 'A', '201401', 4, '작업4', '관리자', SYSDATE FROM DUAL UNION ALL SELECT 'A', '201401', 5, '작업5', '관리자', SYSDATE FROM DUAL ) T1 , (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= 50) T2 WHERE ADD_MONTHS(TO_DATE(A2,'YYYYMM'),RN-1) <= SYSDATE ORDER BY 1,2,3,4 ;
3개 기준 집합(테이블)을 만들어 크로스 조인 하시면 됩니다.
- 1. 업무 : 업무의 갯수만큼
- 2. 연월 : 필요한 연월만큼
- 3. 작업 : 필요한 작업만큼
WITH 업무 AS ( SELECT 'A' job FROM dual UNION ALL SELECT 'B' FROM dual ) , 연월 AS ( SELECT TO_CHAR(ADD_MONTHS(sym, LEVEL - 1), 'yyyymm') ym FROM (SELECT TO_DATE('201401', 'yyyymm') sym, TO_DATE('201505', 'yyyymm') eym FROM dual) CONNECT BY LEVEL <= MONTHS_BETWEEN(eym, sym) ) , 작업 AS ( SELECT LEVEL work_no , '작업' || LEVEL work_nm FROM dual CONNECT BY LEVEL <= 5 ) SELECT job , ym , work_no , work_nm , '관리자' up_id , sysdate up_dt FROM 업무 , 연월 , 작업 ORDER BY job, ym, work_no ;