0

Windows 7上でOracle Data Integrator 11gを使用して一部のインタフェースをテストしています。 すべてのインタフェースで、LKM MSSQL to Oracle(BCP/SQLLDR) 「Jython経由でSQLLDRを呼び出す」コマンドを実行します。私が実行しなかったODI - Windowsシェル上でJython経由でSQLLDRを呼び出します。

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

:それはWindowsシェル上の形式の文字列を実行する必要があり

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

:いくつかのinvesetigation後、私は問題の根本は、次のコード行であることがわかりましたコマンドプロンプトで直接生成された文字列であり、問​​題なく動作しました。

コードで少し演奏した後、に置き換えてos.systemを動作させることができませんでした。私もそれが全部の仕事をするために、コマンドプロンプト(> 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); 

この1がスムーズに動作します。

シェルの出力に関しては、プロンプトへのコマンドの代わりにSQLLDRの引数の一部として解析される '>' charcaterで始まる文字列部分であると思われます。 今、私はそれなしで暮らすことができますが、シェル出力を得るための簡単な回避策があるかどうかを知りたいと思っています。

答えて

0

私はついにシェルの出力を得ることができました。 私は次のように「コールSQLLDRの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); 

意図したとおりに今すべてが働きます。

関連する問題