2016-03-21 33 views
1

Process/ProcessStartInfoからsqlplus.exeを実行しています。 SQLエラーがある場合、正しいゼロ以外の終了コードが得られます。しかし、PL SQLコンパイル・エラーが発生した場合、終了コードとして0(成功)が返されます。Process/ProcessStartInfoからsqlplus.exeを実行し、PL SQLコンパイルエラー時にエラーコードを返す

PL SQLコンパイルエラーが発生した場合、ゼロ以外の終了コードを取得する方法を教えてください。

私はuser_errorsから数えましたが、既存のエラーが存在する可能性があるため、同じパッケージが(同じ理由で)再度失敗した場合、エラーカウントは変更されません。

public int Execute(string installFile, string instance, string userId, string password) 
    { 
     int exitCode;    
     ProcessStartInfo processInfo = new ProcessStartInfo(); 

     processInfo.WorkingDirectory = workingDirectory; 
     processInfo.FileName = "sqlplus.exe"; 
     processInfo.Arguments = string.Format("{0}/{1}@{2} @{3}", userId, password, instance, installFile); 
     processInfo.CreateNoWindow = false; 
     processInfo.UseShellExecute = false; 

     Process process = Process.Start(processInfo); 
     process.WaitForExit(); 
     exitCode = process.ExitCode; 
     process.Close(); 

     return exitCode; 
    } 

これは、SQLファイルをインストールしている - 1(同一の構造と1以上が存在することができる):

foreach(var installFile in list of install files) 
{ 
    exitCode = .Execute(installFile, instance, userId, password); 

    if (exitCode != 0) 
    { 
     .... 
     return -1; 
    } 
} 
+0

パッケージ名を事前に知らなくても、パッケージのコンパイルに失敗したときにSQL * Plusを確実に終了させることはできません。プロセスの標準出力(https://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput(v=vs.110).aspx)をスキャンして、 'パッケージ本体コンパイルエラー 'で作成? –

答えて

0

:これは私が実行を呼び出しています方法です

WHENEVER SQLERROR EXIT SQL.SQLCODE 
WHENEVER OSERROR EXIT FAILURE 

SPOOL spool.txt append; 

@@my_pkg.pks 
@@my_pkg.pkb 

EXIT SQL.SQLCODE 
/

をpl/sqlコンパイラはリターンコード0で完了しています。コンパイルの結果は成功しない可能性があります。 SQL * Plusでは、SHOW ERRORSを使用してpl/sqlコンパイルの結果を確認できます。上記のように、OracleはSYS.USER_ERRORSを使用してこの情報を表示します。オブジェクトを作成する前にpl/sqlオブジェクトを削除してください(存在しないというエラーは無視してください)。これにより、コンパイルの試行に間に合うように、USER_ERRORSが削除されます。

関連する問題