【发布时间】:2016-07-08 13:51:35
【问题描述】:
我正在通过 Process / ProcessStartInfo 执行 sqlplus.exe,如下所示。当出现 SQL 错误时,我得到正确的非零退出代码。但是当出现 PL SQL 编译错误时,我得到 0(成功)作为退出代码。
当出现 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(可以有多个相同结构):
WHENEVER SQLERROR EXIT SQL.SQLCODE
WHENEVER OSERROR EXIT FAILURE
SPOOL spool.txt append;
@@my_pkg.pks
@@my_pkg.pkb
EXIT SQL.SQLCODE
/
这就是我调用执行的方式:
foreach(var installFile in list of install files)
{
exitCode = .Execute(installFile, instance, userId, password);
if (exitCode != 0)
{
....
return -1;
}
}
【问题讨论】:
-
在事先不知道包名的情况下,我认为您无法让 SQL*Plus 在包编译失败时可靠地退出。您是否尝试过扫描进程的标准输出 (msdn.microsoft.com/en-us/library/…) 以查找文本
Package body created with compilation errors?