从 SQLPlus 捕获 Java 中的错误代码
Catching error code in Java from SQLPlus
我正在尝试使用 Java 和 SQLPlus 在文件夹中执行一组 SQL 脚本。我的问题是,我从 SQL 脚本中获取的 return 代码始终为 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
添加到我的脚本中,它似乎可以完美运行。是不是因为我的 return 值取自 cmd.exe 而不是 sqlplus。如果是,我是否可以将错误代码从 sql 加到 cmd 并从那里获取?
所以最终我找到了解决整个问题的方法。这是我必须做的 -
1) 我仍在遍历目录中的所有 sql 脚本,但我没有直接执行它们,而是调用另一个脚本 (test.sql),并将我正在遍历的脚本的文件位置作为参数.该脚本所做的只是将所需的脚本调用为 运行。这是我的 test.sql 文件的内容 -
WHENEVER SQLERROR EXIT 999
WHENEVER OSERROR EXIT 99
prompt &1;
START &1;
&1 表示传递给此 test.sql 文件的第一个参数,它表示我正在迭代的文件。 START 命令 运行s 该文件,并且由于 WHENEVER SQLERROR EXIT 条件,我将正确的代码返回到 Java。
我正在尝试使用 Java 和 SQLPlus 在文件夹中执行一组 SQL 脚本。我的问题是,我从 SQL 脚本中获取的 return 代码始终为 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
添加到我的脚本中,它似乎可以完美运行。是不是因为我的 return 值取自 cmd.exe 而不是 sqlplus。如果是,我是否可以将错误代码从 sql 加到 cmd 并从那里获取?
所以最终我找到了解决整个问题的方法。这是我必须做的 - 1) 我仍在遍历目录中的所有 sql 脚本,但我没有直接执行它们,而是调用另一个脚本 (test.sql),并将我正在遍历的脚本的文件位置作为参数.该脚本所做的只是将所需的脚本调用为 运行。这是我的 test.sql 文件的内容 -
WHENEVER SQLERROR EXIT 999
WHENEVER OSERROR EXIT 99
prompt &1;
START &1;
&1 表示传递给此 test.sql 文件的第一个参数,它表示我正在迭代的文件。 START 命令 运行s 该文件,并且由于 WHENEVER SQLERROR EXIT 条件,我将正确的代码返回到 Java。