【问题标题】:Executing sqlplus.exe through Process / ProcessStartInfo and returning error code when PL SQL compile error通过Process/ProcessStartInfo执行sqlplus.exe,PL SQL编译出错时返回错误码
【发布时间】: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

标签: c# oracle11g sqlplus


【解决方案1】:

pl/sql 编译器正在完成,返回码为 0。编译结果可能不成功。在 sql*plus 中,您可以使用SHOW ERRORS 查看 pl/sql 编译的结果。就像您提到的那样,在后台,Oracle 使用SYS.USER_ERRORS 来显示此信息。在创建对象之前尝试删除 pl/sql 对象(忽略任何“不存在”错误)。这应该将它从 USER_ERRORS 中删除,为您提供一个全新的编译尝试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-22
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多