2015-05-07 3 views
0

Я пытаюсь выполнить набор 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 и взять его оттуда?

+1

Вместо этого лучше выполнить запросы с помощью драйвера jdbc. – Kai

+0

Сценарии могут регулярно меняться, а затем каждый раз приходить в Java для изменения сценариев, это не похоже на хороший вариант. Кроме того, поскольку я повторяю несколько файлов, мы можем добавить больше файлов. Это лучше с точки зрения масштабируемости, и это, похоже, единственная проблема. – Pratik

+0

«0», которое вы получаете, это «destroy()». Это не ответ db –

ответ

0

Так что в итоге я нашел взломать всю эту проблему. Вот что я должен был сделать: 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.