ODI - 在Windows Shell上通过Jython调用SQLLDR

时间:2017-03-06 12:06:27

标签: oracle jython windows-shell sql-loader oracle-data-integrator

我在Windows 7上测试了一些与Oracle Data Integrator 11g的接口。 所有的接口都使用LKM MSSQL到Oracle(BCP / SQLLDR),在运行它们的时候,我通过Jython调用了#34; Call 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 Shell上以以下形式运行:

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

我确实在命令提示符下运行了直接生成的字符串,它没有任何问题。

因此,在使用代码后,我无法使os.system正常工作,因此我将其替换为subprocess.call。我还必须删除字符串的最后一部分,它试图保存命令提示符(> shell_output.out)的输出以使整个过程工作:

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输出,我怀疑问题是以&#39;&gt;&#39;开头的字符串部分。 charcater,它被解析为SQLLDR的参数的一部分,而不是提示的命令。 现在,虽然我可以没有它,但我想问一下是否有人知道任何简单的解决方法来获得shell输出。

1 个答案:

答案 0 :(得分:0)

好的,我终于能够获得shell输出了。 我编辑了“通过Jython调用SQLLDR”命令,其中包含以下内容:

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);

现在一切都按预期工作了。