SQL スクリプトの実行を制御する自動化を開発しています。スクリプトはSQL*PLUSを介して実行され、 PL/SQL呼び出しが含まれています (したがって、 ODP.NETを介してスクリプトを実行することはできません)。
SQL*PLUSへの.NETインターフェイスがあるかどうか疑問に思っていましたか? もしそうなら、誰かがそれを使用しましたか?
SQL スクリプトの実行を制御する自動化を開発しています。スクリプトはSQL*PLUSを介して実行され、 PL/SQL呼び出しが含まれています (したがって、 ODP.NETを介してスクリプトを実行することはできません)。
SQL*PLUSへの.NETインターフェイスがあるかどうか疑問に思っていましたか? もしそうなら、誰かがそれを使用しましたか?
すべてを機能させる方法を理解するのにしばらく時間がかかったので、調査の結果は次のとおりです。
c# コード:
ORAUtils.execString(@"c:\tmp.sql 'Oracle sucks!'");
...
using System.Diagnostics; -- where the Process stuff lives
...
public static int execString(string scriptFileName)
{
...
ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.FileName = "sqlplus.exe";
processInfo.Arguments = "user/pwd@db @" + scriptFileName;
...
Process process = Process.Start(processInfo); // typo in code above small p instead of caps helps
...
結果のコマンドライン:
sqlplus.exe user/pwd@db @c:\tmp.sql 'オラクルはひどい!'
sqlplus /? と入力します。dosプロンプトで次の構文を取得します。
sqlplus
ここで logon=user/pwd@db and start=@c:\tmp.sql 'Oracle は最低!'
SQL ファイルを開始し、パラメータ文字列を渡します。
tmp.sql の最初の行:
プロンプト &1
パラメータ文字列を表示します。
どうも
次のコードを使用して、C# で実行できます。
public int execString(string scriptFileName)
{
int exitCode;
ProcessStartInfo processInfo;
Process process;
int timeout = 5000;
processInfo = new ProcessStartInfo("sqlplus.exe", "@" + scriptFileName);
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
process = process.Start(ProcessInfo);
process.WaitForExit(timeout);
exitCode = process.ExitCode;
process.Close();
return exitCode;
}
VB.NET では、フレームワークで同じ API を使用してまったく同じことを実現できますが、VB.NET の構文についてはよくわかりません。
また、SQL/Plus DLL を検査して、それらから何かを取得できるかどうかを確認することもできます。しかし、それはより高速な (パフォーマンス面での) アプローチであるべきですが、私が提案しているものを使用するよりもはるかに複雑になると思います。