본문 바로가기

ETL Tools/Oracle Data Integrator

[ODI 11g]ODI JOB LOG Version 1.2

--ODI Job log Table create script (Ver 1.2)
--Date. 2012.04.17
--Owner. WideTNS Co, Ltd.
--Created by Cheon Jeonghyeon

/* 버전 변경사항
  1. 작업 건수 추가 ( INSERT, UPDATE, DELETE, ERROR ) 
  2. PK 추가 (세션 번호, 작업 시작 시간)
    * 이유: 한 세션에서 작업을 일회성이 아닌 LOOPING 작업을 통해 진행하여야 하고 그 사항을 기록하여 추적하고 싶을 경우가 발생하여, 세션번호 하나만 가지고는 데이터를 판별하는 것이 불가능하여 작업 시작 시간을 추가함. 물론 이 추가 작업으로 인해 데이터 무결성에 문제가 발생할 수 있으므로 이후 PK 변경이 필요할 듯 보인다. 
*/

-- Generated on 2012/04/17 10:27:58

CREATE TABLE XXX_ODI_REPO.ETL_JOB_LOG 
(
SESS_NO         NUMBER (19) NOT NULL,
SESS_NAME       VARCHAR2 (436 CHAR) NOT NULL,
SCEN_NAME       VARCHAR2 (400 CHAR),
TASK_BEG        VARCHAR2 (14) NOT NULL,
TASK_END        VARCHAR2 (14) NOT NULL,
TASK_RAN        VARCHAR2 (10) NOT NULL,
TASK_STATUS     VARCHAR2 (10),
TASK_RST        CHAR (1) DEFAULT 'N',
NB_INS          NUMBER (10),
NB_UPD          NUMBER (10),
NB_DEL          NUMBER (10),
NB_ERR          NUMBER (10),
ERR_MSG         VARCHAR2 (4000),
LD_OP_DTM       DATE DEFAULT sysdate,
UPD_LD_OP_DTM   DATE
);
COMMENT ON TABLE HTS_ODI_REPO.ODI_TASK_LOG IS 'Oracle Data Integrator task log' ;
COMMENT ON COLUMN HTS_ODI_REPO.ODI_TASK_LOG.ERR_MSG IS '오류 메세지' ;
COMMENT ON COLUMN HTS_ODI_REPO.ODI_TASK_LOG.LD_OP_DTM IS '기록일시' ;
COMMENT ON COLUMN HTS_ODI_REPO.ODI_TASK_LOG.NB_DEL IS '이전 작업 삭제 건수' ;
COMMENT ON COLUMN HTS_ODI_REPO.ODI_TASK_LOG.NB_ERR IS '이전 작업 오류 건수' ;
COMMENT ON COLUMN HTS_ODI_REPO.ODI_TASK_LOG.NB_INS IS '이전 작업 삽입 건수' ;
COMMENT ON COLUMN HTS_ODI_REPO.ODI_TASK_LOG.NB_UPD IS '이전 작업 갱신 건수' ;
COMMENT ON COLUMN HTS_ODI_REPO.ODI_TASK_LOG.SCEN_NAME IS '시나리오 명, if exists on ODI' ;
COMMENT ON COLUMN HTS_ODI_REPO.ODI_TASK_LOG.SESS_NAME IS '세션 명 on ODI' ;
COMMENT ON COLUMN HTS_ODI_REPO.ODI_TASK_LOG.SESS_NO IS '세션 번호 on ODI' ;
COMMENT ON COLUMN HTS_ODI_REPO.ODI_TASK_LOG.TASK_BEG IS '데이터 추출 범위 일시(Start)' ;
COMMENT ON COLUMN HTS_ODI_REPO.ODI_TASK_LOG.TASK_END IS '데이터 추출 범위 일시(Stop)' ;
COMMENT ON COLUMN HTS_ODI_REPO.ODI_TASK_LOG.TASK_RAN IS '배치 주기(데이터 추출 범위)' ;
COMMENT ON COLUMN HTS_ODI_REPO.ODI_TASK_LOG.TASK_RST IS '작업 결과' ;
COMMENT ON COLUMN HTS_ODI_REPO.ODI_TASK_LOG.TASK_STATUS IS '작업 수행 상태' ;
COMMENT ON COLUMN HTS_ODI_REPO.ODI_TASK_LOG.UPD_LD_OP_DTM IS '갱신일시' ;

CREATE UNIQUE INDEX HTS_ODI_REPO.PK_ODI_TASK_LOG 
ON HTS_ODI_REPO.ODI_TASK_LOG
(
SESS_NO ASC,
TASK_BEG ASC
) ;

CREATE INDEX HTS_ODI_REPO.INX1_ODI_TASK_LOG 
ON HTS_ODI_REPO.ODI_TASK_LOG
(
SESS_NAME ASC,
TASK_RST ASC
) ;

-- INSERT LOG QUERY

/* 내부에서 사용하는 ODI 변수의 내용은 이전 버전과 다르지 않다.*/
-- STEP1: INSERT LOG

INSERT INTO HTS_ODI_REPO.ODI_TASK_LOG
(
SESS_NO         ,
SESS_NAME       ,
SCEN_NAME       ,
TASK_BEG        ,
TASK_END        ,
TASK_RAN        ,
TASK_STATUS     ,
TASK_RST        ,
NB_INS,
NB_UPD,
NB_DEL,
NB_ERR,
ERR_MSG         ,
LD_OP_DTM 
SELECT 
'<%=snpRef.getSession("SESS_NO")%>',
'<%=snpRef.getSession("SESS_NAME")%>',
'<%=snpRef.getSession("SCEN_NAME")%>',
'#V_TASK_BEG',
'#V_TASK_END',
#V_TASK_RAN,
'#V_TASK_STATUS',
'<%=odiRef.getPrevStepLog("INSERT_COUNT")%>',
'<%=odiRef.getPrevStepLog("DELETE_COUNT")%>',
'<%=odiRef.getPrevStepLog("UPDATE_COUNT")%>',
'<%=odiRef.getPrevStepLog("ERROR_COUNT")%>',
DECODE('<%=odiRef.getPrevStepLog("MESSAGE")%>','','Y','N'),
'<%=odiRef.getPrevStepLog("MESSAGE")%>',
SYSDATE
FROM DUAL

-- STEP 2: ERROR MESSAGE
/* 작업에서 실제 오류가 발생하였을 경우 로그상에도 오류를 발생시키고 종료하기 위해 작업 추가*/
<%=odiRef.getPrevStepLog("MESSAGE")%>


이전 버전
-ODI Job log Table create script (Ver 1.1)
--Date. 2012.03.12
--Owner. WideTNS Co, Ltd.
--Created by Cheon Jeonghyeon

-- DDL Script for TABLE ODI_REPO.ODI_TASK_LOG. Orange for ORACLE.
-- Generated on 2012/03/09 14:40:38 by ODI_REPO
 
CREATE TABLE ODI_REPO.ODI_TASK_LOG 
(
SESS_NO         NUMBER (19) NOT NULL,
SESS_NAME       VARCHAR2 (436 CHAR) NOT NULL,
BATCH_YN        CHAR (1) DEFAULT 'N',
SCEN_NAME       VARCHAR2 (400 CHAR),
TASK_BEG        VARCHAR2 (14) NOT NULL,
TASK_END        VARCHAR2 (14) NOT NULL,
TASK_RAN        VARCHAR2 (10) NOT NULL,
TASK_STATUS     VARCHAR2 (10),
TASK_RST        CHAR (1) DEFAULT 'N',
ERR_MSG         VARCHAR2 (4000),
LD_OP_DTM       DATE DEFAULT sysdate,
UPD_LD_OP_DTM   DATE
);

COMMENT ON TABLE ODI_REPO.ODI_TASK_LOG IS 'Oracle Data Integrator task log' ;
COMMENT ON COLUMN ODI_REPO.ODI_TASK_LOG.BATCH_YN IS '배치 수행: Y, 사용자 수동 실행: N' ;
COMMENT ON COLUMN ODI_REPO.ODI_TASK_LOG.ERR_MSG IS '오류 메세지' ;
COMMENT ON COLUMN ODI_REPO.ODI_TASK_LOG.LD_OP_DTM IS '기록일시' ;
COMMENT ON COLUMN ODI_REPO.ODI_TASK_LOG.SCEN_NAME IS '시나리오 명, if exists on ODI' ;
COMMENT ON COLUMN ODI_REPO.ODI_TASK_LOG.SESS_NAME IS '세션 명 on ODI' ;
COMMENT ON COLUMN ODI_REPO.ODI_TASK_LOG.SESS_NO IS '세션 번호 on ODI' ;
COMMENT ON COLUMN ODI_REPO.ODI_TASK_LOG.TASK_BEG IS '데이터 추출 범위 일시(Start)' ;
COMMENT ON COLUMN ODI_REPO.ODI_TASK_LOG.TASK_END IS '데이터 추출 범위 일시(Stop)' ;
COMMENT ON COLUMN ODI_REPO.ODI_TASK_LOG.TASK_RAN IS '배치 주기(데이터 추출 범위)' ;
COMMENT ON COLUMN ODI_REPO.ODI_TASK_LOG.TASK_RST IS '작업 결과' ;
COMMENT ON COLUMN ODI_REPO.ODI_TASK_LOG.TASK_STATUS IS '작업 수행 상태' ;
COMMENT ON COLUMN ODI_REPO.ODI_TASK_LOG.UPD_LD_OP_DTM IS '갱신일시' ;
CREATE UNIQUE INDEX ODI_REPO.PK_ODI_TASK_LOG ON ODI_REPO.ODI_TASK_LOG(SESS_NO ASC);
CREATE UNIQUE INDEX ODI_REPO.INX1_ODI_TASK_LOG ON ODI_REPO.ODI_TASK_LOG(SESS_NAME ASC, BATCH_YN ASC);
ALTER TABLE ODI_REPO.ODI_TASK_LOG ADD(CONSTRAINT PK_ODI_TASK_LOG PRIMARY KEY (SESS_NO));

/*#V_INPUT_BEG
변수 설명: 사용자가 수동으로 작업을 수행시킬 때 사용하는 변수 
사용 방법: 수동 실행시 yyyymmddhh24miss 형식의 date 값을 넣어 수행한다.*/

/*#V_INPUT_END
변수 설명: 사용자가 수동으로 작업을 수행시킬 때 사용하는 변수 
사용 방법: 수동 실행시 yyyymmddhh24miss 형식의 date 값을 넣어 수행한다.*/


/*#V_TASK_BEG
변수 설명: 스케쥴링 데이터 추출 기준 일시 (Start)
         * 로그에서 Max(end)를 가져온다ㅏ. 
         * Input 일시가 있을 경우 그 값을 사용할 것 (로그를 어떻게 남기느냐??)
         * ?스케쥴링 종료 일자가 input '정상' 종료일자보다 과거일 경우 input 종료 일자를 사용한다. */

SELECT MAX( EJL.TASK_END)
FROM ODI_REPO.odi_TASK_LOG ETL
WHERE SCEN_NAME = '<%=snpRef.getSession("SESS_NAME")%>'
AND BATCH_YN = 'Y'
AND TASK_RST = 'Y'
;

/*#V_TASK_END
변수 설명: 스케쥴링 데이터 추출 기준 일시 (Start)
         * 배치 기준에 따른다. (일 배치: trunc(sysdate))
         * 기존의 재처리시 looping 작업은 수행하지 않는다.(WHY? 데이터가 많지 않기 때문에..) */

SELECT RPAD(TO_CHAR(SYSDATE,DECODE(#V_TASK_RAN,1,'YYYYMMDD', 'YYYYMMDDHH24MISS')),14,'0')
FROM DUAL;

/*#V_TASK_RAN
변수 설명: 배치 주기(1 DAY=1, 1HOUR = 1/24...) 
         * 실 의미는 데이터 추출 범위로 주로 배치주기와 같은 값을 갖는다. */

/*#V_TASK_STATUS
변수 설명: 작업 상태
         - Running  : 같은 세션명의 작업이 진행중인 경우 -> 종로
         - Great    : 정상 진행
         - Delayed  : 지연 진행
         - Overflow : 수행 구간 Overflow */

SELECT
    CASE
      WHEN COUNT (1) > 1 THEN 'Running'
      WHEN SYSDATE < TO_DATE('#V_TASK_END','YYYYMMDDHH24MISS') THEN 'Overflow' 
      WHEN SYSDATE <= TO_DATE('#V_TASK_END','YYYYMMDDHH24MISS') + #V_TASK_RAN THEN 'Great' 
      WHEN SYSDATE > TO_DATE('#V_TASK_END','YYYYMMDDHH24MISS') + #V_TASK_RAN THEN 'Delayed'
      ELSE 'Etc'
    END
FROM ODI_REPO.SNP_SESSION S_SESS
WHERE 1=1
AND S_SESS.SESS_NAME = '<%=snpRef.getSession("SESS_NAME")%>'
AND S_SESS.SESS_STATUS = 'R'
;

INSERT INTO ODI_REPO.ODI_TASK_LOG
(
    SESS_NO         ,
SESS_NAME       ,
BATCH_YN        ,
SCEN_NAME       ,
TASK_BEG        ,
TASK_END        ,
TASK_RAN        ,
TASK_STATUS     ,
TASK_RST        ,
ERR_MSG         ,
LD_OP_DTM 
SELECT 
    '<%=snpRef.getSession("SESS_NO")%>',
    '<%=snpRef.getSession("SESS_NAME")%>',
    NVL2('#V_INPUT_BEG'||'#V_INPUT_END','N','Y'),
    '<%=snpRef.getSession("SCEN_NAME")%>',
'#V_TASK_BEG',
'#V_TASK_END',
#V_TASK_RAN,
'#V_TASK_STATUS',
'Y',
'<%=odiRef.getPrevStepLog("MESSAGE")%>',
SYSDATE
FROM DUAL
;
 



--ODI Job log Table create script (Ver 1.0)
--Date. 2012.03.08
--Owner. WideTNS Co, Ltd.
--Created by Cheon Jeonghyeon

CREATE TABLE DEV1_ODI_REPO.ODI_TASK_LOG 
(
SESS_NO         NUMBER (19) NOT NULL,
SESS_NAME       VARCHAR2 (436 CHAR) NOT NULL,
SCEN_NAME       VARCHAR2 (400 CHAR),
TASK_BEG        VARCHAR2 (14) NOT NULL,
TASK_END        VARCHAR2 (14) NOT NULL,
TASK_RAN        VARCHAR2 (10) NOT NULL,
TASK_RST        CHAR (1) DEFAULT 'N',
ERR_MSG         VARCHAR2 (4000),
LD_OP_DTM       DATE DEFAULT sysdate,
UPD_LD_OP_DTM   DATE
) DISABLE ROW MOVEMENT;

CREATE UNIQUE INDEX DEV1_ODI_REPO.PK_ODI_TASK_LOG 
ON DEV1_ODI_REPO.ODI_TASK_LOG
(
SESS_NO ASC
) NOLOGGING
NOCOMPRESS
NOPARALLEL ;

ALTER TABLE DEV1_ODI_REPO.ODI_TASK_LOG ADD( CONSTRAINT PK_ODI_TASK_LOG PRIMARY KEY (SESS_NO));

COMMENT ON TABLE DEV1_ODI_REPO.ODI_TASK_LOG IS 'Oracle Data Integrator 작업 log';
COMMENT ON COLUMN DEV1_ODI_REPO.ODI_TASK_LOG.SESS_NO IS '세션 번호 on ODI';
COMMENT ON COLUMN DEV1_ODI_REPO.ODI_TASK_LOG.SESS_NAME IS '세션 명 on ODI';
COMMENT ON COLUMN DEV1_ODI_REPO.ODI_TASK_LOG.SCEN_NAME IS '시나리오 명, if exists on ODI';
COMMENT ON COLUMN DEV1_ODI_REPO.ODI_TASK_LOG.TASK_BEG IS '데이터 추출 범위 일시(Start)';
COMMENT ON COLUMN DEV1_ODI_REPO.ODI_TASK_LOG.TASK_END IS '데이터 추출 범위 일시(Stop)';
COMMENT ON COLUMN DEV1_ODI_REPO.ODI_TASK_LOG.TASK_RAN IS '배치 주기(데이터 추출 범위)';
COMMENT ON COLUMN DEV1_ODI_REPO.ODI_TASK_LOG.TASK_RST IS '작업 결과';
COMMENT ON COLUMN DEV1_ODI_REPO.ODI_TASK_LOG.ERR_MSG IS '오류 메세지';
COMMENT ON COLUMN DEV1_ODI_REPO.ODI_TASK_LOG.LD_OP_DTM IS '기록일시';
COMMENT ON COLUMN DEV1_ODI_REPO.ODI_TASK_LOG.UPD_LD_OP_DTM IS '갱신일시';