ETL Tools/Oracle Data Integrator

Using suqueries in Oracle Data Integrator (ODI) interfaces for complex data integration requirements

천정현 2010. 4. 19. 16:35

ODI interface Subquery 구현 방법.

 

인터페이스에서 서브쿼리를 Temp Table을 생성하지 않고 SQL Query 관리를 통해 구현 가능함

환경 구성

Database          Oracle 11g

Userid/Password test/test 

구성해 볼 Query

 

INSERT INTO TEST.PRODUCT_SHIPMENT_DAY(

MODEL,

                  YYYYMMDD,

                  PRODUCT_QTY,

                  SHIPMENT_QTY      )

select          NVL(PROD.MODEL,SHIP.MODEL)             MODEL,

                  nvl(PROD.YYYYMMDD,SHIP.YYYYMMDD)                     YYYYMMDD,

                  PROD.QTY       PRODUCT_QTY,

                  SHIP.QTY         SHIPMENT_QTY

from           (

select      SHIPMENT.MODEL             MODEL,

             to_char(SHIPMENT.YYYYMMDD,'yyyymmdd')               YYYYMMDD,

             sum(SHIPMENT.QTY)          QTY

from       TEST.SHIPMENT   SHIPMENT

where     (1=1)

And        (SHIPMENT.YYYYMMDD >= to_date('20100421'||'000000','yyyymmddhh24miss')

And        SHIPMENT.YYYYMMDD <= to_date('20100421'||'235959','yyyymmddhh24miss'))

Group By                   SHIPMENT.MODEL,

to_char(SHIPMENT.YYYYMMDD,'yyyymmdd')

) SHIP

FULL OUTER JOIN (

select      PRODUCT.MODEL              MODEL,

             to_char(PRODUCT.YYYYMMDD,'yyyymmdd')                YYYYMMDD,

             SUM(PRODUCT.QTY)          QTY

from       TEST.PRODUCT   PRODUCT

where     (1=1)

And        (PRODUCT.YYYYMMDD >= to_date('20100421'||'000000','yyyymmddhh24miss')

And        PRODUCT.YYYYMMDD <= to_date('20100421'||'235959','yyyymmddhh24miss'))

Group By                   PRODUCT.MODEL,

to_char(PRODUCT.YYYYMMDD,'yyyymmdd')

) PROD

ON (SHIP.YYYYMMDD=PROD.YYYYMMDD) AND PROD.MODEL=SHIP.MODEL

where         (1=1)

1. Source Table 생성

PRODUCT

CREATE TABLE TEST.PRODUCT

(

                  MODEL      VARCHAR2 (10),

                  QTY        NUMBER,

                  LINE       VARCHAR2 (5),

                  YYYYMMDD   DATE

)

 

SHIPMENT

CREATE TABLE TEST.SHIPMENT

(

                  MODEL      VARCHAR2 (10),

                  QTY        NUMBER,

                  LINE       VARCHAR2 (5),

                  YYYYMMDD   DATE

)

2. Target Table 생성

PRODUCT_SHIPMENT_DAY

CREATE TABLE TEST.PRODUCT_SHIPMENT_DAY

(

                  MODEL          VARCHAR2 (10) NOT NULL,

                  YYYYMMDD       VARCHAR2 (8) NOT NULL,

                  PRODUCT_QTY    NUMBER,

                  SHIPMENT_QTY   NUMBER

)

3. SubQuery 인터페이스 생성

 

정의 탭

이름 : IF.PROD_DAY

대상과 다른 준비영역 체크 : 모델과 같은 논리적 스키마 선택

 

  

 

 

다이어그램 탭 :

소스 설정

타겟 설정

데이터 스키마

이름 : PROD

DRAG & DROPQ방식, ‘열추가명령를 통해 행 생성 및 EXPRESSION 설정

SQL에 맞게 매핑정보 설정.

select      SHIPMENT.MODEL             MODEL,

             to_char(SHIPMENT.YYYYMMDD,'yyyymmdd')               YYYYMMDD,

             sum(SHIPMENT.QTY)          QTY

from       TEST.SHIPMENT   SHIPMENT

where     (1=1)

And        (SHIPMENT.YYYYMMDD >= to_date('20100421'||'000000','yyyymmddhh24miss')

And        SHIPMENT.YYYYMMDD <= to_date('20100421'||'235959','yyyymmddhh24miss'))

 

 

흐름 탭

첨부된 KM 사용

Create procedures 옵션 예 설정 : 초기 프로시저 생성.

 

 

 

 

 


 

-       같은 방식으로 2번째 서브쿼리를 나타내는 인터페이스 생성

 

 

select      PRODUCT.MODEL              MODEL,

             to_char(PRODUCT.YYYYMMDD,'yyyymmdd')                YYYYMMDD,

             SUM(PRODUCT.QTY)          QTY

from       TEST.PRODUCT   PRODUCT

where     (1=1)

And        (PRODUCT.YYYYMMDD >= to_date('20100421'||'000000','yyyymmddhh24miss')

And        PRODUCT.YYYYMMDD <= to_date('20100421'||'235959','yyyymmddhh24miss'))

 

 

 

옵션값 기본 값 유지.

 

 

 

 

 

4. Main Query 인터페이스 생성

 

생성된 노랑 인터페이스를 사용하여 소스를 구성

SQL 매핑설정

select         

                  NVL(PROD.MODEL,SHIP.MODEL)             MODEL,

                  nvl(PROD.YYYYMMDD,SHIP.YYYYMMDD)                     YYYYMMDD,

                  PROD.QTY       PRODUCT_QTY,

                  SHIP.QTY         SHIPMENT_QTY

from           TEST.SHIP    SHIP

FULL OUTER JOIN           TEST.PROD    PROD

ON (SHIP.YYYYMMDD=PROD.YYYYMMDD) AND PROD.MODEL=SHIP.MODEL

where         (1=1)

 

옵션 설정.

Commit;

Insert


 

5. Package 생성

 

 

SubQuery -> MainQuery 로 시나리오 진행


 

 

6. Test & 결과 확인

 

*** IKM Oracle Append( With as, SubQuery)

 

SQL Query table에 저장하여 실 테이블에 적재할 때 Table Name SubQuery 부분을 치환하여 새로운 쿼리를 생성한 후 실행.

 

KM 옵션 설명 :

commit : 커밋여부 설정

insert : insert작업을 할 것인지 여부 설정

    - 타겟이 테이블인경우 예 설정.

    - sql 구문이 오류가 발생하여 SQL Query 를 확인해야 할 경우 아니오 설정후
Debug: substituted subquery value
단계에서 확인 가능

drop meta: sql를 저장하는 테이블을 drop 할 것인지 여부 설정

create procedures : KM에서 사용하는 Oracle Procedure들을 사용할 것인지 여부 설정 ( 최초 1회 예 설정)

 

 

 

** Error Case

 

-       Query 속의 FULL OUTER JOIN 문법이 알맞지 않은 경우

해결 방법 : Topology Oracle 기술 편집

  

** outer join 제거 후 실행하여 SubQuery가 잘 실행되는 지부터 확인한다.

 

-       Insert java.lang.NumberFormatException: For input string: "4294967295" 발생시

원인 : ODI내에서  CLOB 타입 지원 안하는 경우

해결책 : odiparams.bat file 수정

set ODI_ADDITIONAL_JAVA_OPTIONS="-Djava.security.policy=server.policy"

set ODI_ADDITIONAL_JAVA_OPTIONS=%ODI_ADDITIONAL_JAVA_OPTIONS% "-Doracledatabasemetadata.get_lob_precision=false"

 

** 보완해야 할 사항.

 

-       With As Test

-       Source Target이 다른 경우에도 사용 가능하도록 현재 IKM LKM IKM으로 분할하는 작업