0

Windows 7에서 Oracle Data Integrator 11g로 일부 인터페이스를 테스트 중입니다. 모든 인터페이스에서 LKM MSSQL to Oracle (BCP/SQLLDR)을 사용하고 있습니다. "자이 썬을 통해 SQLLDR 호출"명령.ODI - Windows 쉘에서 Jython을 통해 SQLLDR을 호출하십시오.

exitCode = os.system(sqlldr + " control=" + tempSessionFilePrefix + ".ctl log=" + tempSessionFilePrefix + ".log " + "userid=" + "<% out.print(odiRef.getInfo("DEST_USER_NAME")); %>" + "/" + "<% out.print(odiRef.getInfo("DEST_PASS")); %>" + tnsnameOption + " > " + tempSessionFilePrefix +".out"); 

그것은의 형태로 Windows 셸의에 문자열을 실행해야합니다 : 일부 invesetigation 후 나는 문제의 근본 다음 코드 줄 것을 발견했다 내가 실행 않았다

sqlldr control=control_file.ctl log=log_file.log userid=ODI_STAGE/ODI_STAGE > shell_output.out 

문자열을 명령 프롬프트에 직접 생성하고 아무런 문제없이 작동했습니다.

따라서 코드를 조금 재생 한 후에 으로 바꿔서 os.system을 작동시키지 못했습니다. 이 일이 원활하게 작동

exitCode = subprocess.call([sqlldr, "control=" + tempSessionFilePrefix + ".ctl", "log=" + tempSessionFilePrefix + ".log", "userid=" + "<% out.print(odiRef.getInfo("DEST_USER_NAME")); %>" + "/" + "<% out.print(odiRef.getInfo("DEST_PASS")); %>" + tnsnameOption], shell=True); 

: 그것은 모든 것을 작동하게하는 명령 프롬프트 (> shell_output.out)의 OUPUT을 저장하려고 어디 또한 문자열의 마지막 부분을 제거해야합니다.

쉘 출력에 관해서는 문제가 프롬프트에 대한 명령 대신 SQLLDR 인수의 일부로 구문 분석되는 '>'charcater로 시작하는 문자열 부분이라고 생각됩니다. 자, 내가 없이는 살 수있는 동안, 나는 쉘 출력을 얻기위한 간단한 해결 방법을 알고 있는지 묻고 싶다.

답변

0

나는 마침내 쉘 출력을 얻을 수있었습니다. 의도 한대로 이제

from __future__ import with_statement 
import subprocess 

... 

with open(tempSessionFilePrefix + ".out", "w") as fout: 
exitCode = subprocess.call([sqlldr, "control=" + tempSessionFilePrefix + ".ctl", "log=" + tempSessionFilePrefix + ".log", "userid=" + "ODI_STAGE" + "/" + "<@=snpRef.getInfo("DEST_PASS") @>" + tnsnameOption], stdout=fout, shell=True); 

모든 작업 : 나는 다음과 "전화 SQLLDR 자이 썬을 통해"명령을 편집했다.