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

ODI - Call SQLLDR via Jython on Windows Shell

我正在 Windows 7 上使用 Oracle Data Integrator 11g 测试一些接口。 所有接口都使用 LKM MSSQL to Oracle (BCP/SQLLDR),而 运行 在 "Call SQLLDR via Jython" 命令上出现错误。经过一些调查,我发现问题的根源是以下代码行:

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

应该运行放在WindowsShell一个字符串的形式为:

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

好的,我终于能够得到 shell 输出。 我使用以下内容编辑了 "Call SQLLDR via Jython" 命令:

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

现在一切正常。