프로시저 호출시 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()