Я пытаюсь выполнить набор SQL-скриптов в папке с использованием Java и SQLPlus. Моя проблема в том, что код возврата, который я получаю из моего SQL-скрипта, всегда равен 0, даже если есть ошибки. Это то, что я пытаюсь сделать -Ошибка кода ошибки в Java от SQLPlus
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');
EDIT - Если бы я добавить, WHENEVER SQLERROR EXIT 1 WHENEVER OSERROR EXIT 2
в моем сценарии, кажется, работает отлично. Это потому, что моя возвращаемая стоимость берется из cmd.exe, а не sqlplus. если да, то в любом случае я могу пузырить код ошибки из sql plus в cmd и взять его оттуда?
Вместо этого лучше выполнить запросы с помощью драйвера jdbc. – Kai
Сценарии могут регулярно меняться, а затем каждый раз приходить в Java для изменения сценариев, это не похоже на хороший вариант. Кроме того, поскольку я повторяю несколько файлов, мы можем добавить больше файлов. Это лучше с точки зрения масштабируемости, и это, похоже, единственная проблема. – Pratik
«0», которое вы получаете, это «destroy()». Это не ответ db –