从 SQLPlus 捕获 Java 中的错误代码

Posted

技术标签:

【中文标题】从 SQLPlus 捕获 Java 中的错误代码【英文标题】:Catching error code in Java from SQLPlus 【发布时间】:2015-05-07 11:47:53 【问题描述】:

我正在尝试使用 Java 和 SQLPlus 在文件夹中执行一组 SQL 脚本。我的问题是我从我的 SQL 脚本得到的返回码总是 0,即使有错误。这就是我想要做的 -

   StringBuffer command = new StringBuffer();
   String[] cmd = new String[3];
        cmd[0] = "cmd.exe";
        cmd[1] = "/C";
        cmd[2] = "echo WHENEVER SQLERROR EXIT 1 WHENEVER OSERROR EXIT 2 | sqlplus " + args[1] + "/" + args[2] + "@" + args[3] + "/" + args[4] + " " + fileName;
        for (int i = 0; i < cmd.length; i++) 
            command.append(cmd[i]);
            command.append(" ");
        
   Process p = Runtime.getRuntime().exec(command.toString());
   p.destroy();
   System.out.println("Exit value" + p.exitValue()); // Its always 0.

所以理想情况下,我期待错误代码 1,因为我使用了 WHENEVER SQLERROR EXIT 1。但我总是将 exitValue 设为 0。这是违反 PK 约束的脚本 -

INSERT INTO U_5837_F_6149_tbl VALUES ('E', 'B', 'Y');
INSERT INTO U_5837_F_6149_tbl VALUES ('E', 'M', 'Y');
INSERT INTO U_5837_F_6149_tbl VALUES ('E', 'M', 'Y');

编辑 - 如果我将 WHENEVER SQLERROR EXIT 1 WHENEVER OSERROR EXIT 2 添加到我的脚本中,它似乎可以完美运行。是不是因为我的返回值取自 cmd.exe 而不是 sqlplus。如果是的话,我是否可以将错误代码从 sql plus 冒泡到 cmd 并从那里获取?

【问题讨论】:

您最好使用 jdbc 驱动程序来执行查询。 脚本可以定期更改,然后每次都来Java更改脚本似乎不是一个好的选择。此外,由于我正在迭代多个文件,我们可以添加更多文件。这在可扩展性方面更好,这似乎是唯一的问题 你得到的“0”来自“destroy()”。这不是 db 的响应 我删除了 p.destroy 调用,它仍然给我 0 【参考方案1】:

所以最终我找到了解决整个问题的方法。这就是我必须做的 - 1)我仍在迭代一个目录中的所有 sql 脚本,但我没有直接执行它们,而是调用另一个脚本(test.sql),并将我正在迭代的脚本的文件位置作为参数。该脚本所做的只是调用要运行的所需脚本。这是我的 test.sql 文件的内容 -

WHENEVER SQLERROR EXIT 999
WHENEVER OSERROR EXIT 99

prompt &1;
START &1;

&1 这里代表传递给这个 test.sql 文件的第一个参数,它代表我正在迭代的文件。 START 命令运行该文件,并且由于 WHENEVER SQLERROR EXIT 条件,我将正确的代码返回给 Java。

【讨论】:

以上是关于从 SQLPlus 捕获 Java 中的错误代码的主要内容,如果未能解决你的问题,请参考以下文章

redux-observable 无法从发出的动作中捕获错误,错误会停止动作流

Java中的异常

Java中的异常处理

Java 异常

Java如何捕获应用程序的Runtime error

如何从 java 代码在启用 ssh 的 unix 机器上执行 sqlplus 命令