본문 바로가기

ETL Tools/Oracle Data Integrator

[ODI] "SESS_NO" 사용시 literal 발생 방지

프로시저 호출시 literal이 발생하는 <%=odiRef.getSession("SESS_NO")%> 에 대하여 

jython  호출 방식으로 변환하여 파라미터로 넘길 수 있도록 변경한다. 


테스트


0. 개발 환경 구성 (Config test environment)


--1. create table script

create table sess_no_test (sessno number, insert_date date default sysdate) ;

create table password_test (passwd varchar2(100), insert_date date default sysdate) ;


select * from odi_wrk.sess_no_test order by 2 desc;

select * from odi_wrk.password_test ;



--2. create oracle stored procedure

CREATE OR REPLACE PROCEDURE etl_sess_no_test(p_sess_no number, p_str varchar2)

IS


BEGIN

  insert into sess_no_test (sessno ) values (p_sess_no);

  insert into password_test (passwd ) values (p_str);

  commit;

END etl_sess_no_test;

/


--3. call procedure for test

begin etl_sess_no_test(1, 'test'); end;


1. ODI 프로시저 생성(Create ODI Procedure)


Name: PRC.CALL_PROC_BY_JYTHON

step:

 Source Command 

Tech: Oracle

Schema: ODI_WRK

Command: 


 Target Command

Tech: Jython

Command:

import java.sql as sql 

import java.lang as lang 

import java.sql.Types as types 


driver = '<%=odiRef.getInfo( "SRC_JAVA_DRIVER" )%>'


##### Register Driver

lang.Class.forName(driver)


##### Create a Connection Object 

myCon = snpRef.getJDBCConnection("SRC")


try: 

inVar1 = <%=odiRef.getSession("SESS_NO")%>

strVar1 = ''

myStmt = myCon.prepareCall('begin odi_wrk.etl_sess_no_test(?,?); end;'); 


## Bind 1st and 2nd parameters (IN parameters)

myStmt.setInt(1, inVar1);

myStmt.setString(2, strVar1);


## Execute the callable statement 

myStmt.execute(); 


finally: 

## Close the Connection

myCon.close() 


2. 결과 확인(Check result)


select * 

FROM v$sqlarea

where SQL_TEXT like '%etl_sess_no_test%'


begin odi_wrk.etl_sess_no_test(:1,:2 ); end;

 

 

 


 

2012.11.23 추가 수정 정보

 

수정 부분

* ODI 변수 사용 테스트 추가

  #A

* JdbcConnection close() 이슈  발생에 대한 해결 방안 추가

  내용: "myCon.close()" 실제 연결하고 있는 JdbcConnection 을 끊어서 다음작업이 있을 경우 Error로 처리됨

 

수정한 명령스크립트

 

import java.sql as sql
import java.lang as lang
import java.sql.Types as types

driver = '<%=odiRef.getInfo( "SRC_JAVA_DRIVER" )%>'

##### Register Driver
lang.Class.forName(driver)

##### Create a Connection Object
myCon = snpRef.getJDBCConnection("SRC")

try:
 inVar1 = <%=odiRef.getSession("SESS_NO")%>
 strVar1 = '#A'
 myStmt = myCon.prepareCall('begin odi_wrk.etl_sess_no_test(?,?); end;');

 ## Bind 1st and 2nd parameters (IN parameters)
 myStmt.setInt(1, inVar1);
 myStmt.setString(2, strVar1);

 ## Execute the callable statement
 myStmt.execute();

finally:
 ## Close the Connection
 myCon is None
 ## myCon.close()