我正在尝试使用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加到cmd并从那里取出来?
答案 0 :(得分:0)
所以最终我发现了整个问题的黑客攻击。这是我必须做的 - 1)我仍在迭代目录中的所有sql脚本,但我没有直接执行它们,而是调用另一个脚本(test.sql),其中包含我作为参数迭代的脚本的文件位置。所有脚本都会调用所需的脚本来运行。以下是我的test.sql文件的内容 -
WHENEVER SQLERROR EXIT 999
WHENEVER OSERROR EXIT 99
prompt &1;
START &1;
&amp; 1此处表示传递给此test.sql文件的第一个参数,该文件表示我正在迭代的文件。 START命令运行该文件,并且由于WHENEVER SQLERROR EXIT条件,我将正确的代码返回给Java。