В Java Exception нет того же сообщения об исключении, которое возвращается с консоли db2? - PullRequest
0 голосов
/ 28 января 2019

Я хочу вставить несколько строк в таблицу из консоли / инструмента (например, Data Studio) Я получаю следующее сообщение об ошибке

ВСТАВЛЕНИЕ ИЛИ ОБНОВЛЕНИЕ ЗНАЧЕНИЯ ИНОСТРАННОГО КЛЮЧА FK $ MAR $S НЕВЕРНО.SQLCODE = -530, SQLSTATE = 23503, DRIVER = 4.13.111

Это означает, что у меня возникли некоторые проблемы с переменной FOREIGN KEY, но я решил, что позже, и она работает хорошо.

Моя проблема в том, что когда я выполняю тот же запрос из приложения Java, используя PreparedStatement.executeBatch() (пакетно, потому что он может вставлять более одной строки за раз), я получаю другое сообщение об ошибке:

com.ibm.db2.jcc.am.wn: [jcc] [t4] [102] [10040] [3.57.82] Сбой пакета.Партия была отправлена, но по крайней мере одно исключение произошло с отдельным участником партии.Используйте getNextException (), чтобы получить исключения для определенных пакетных элементов.ОШИБКА = -4228, SQLSTATE = null

Когда я использовал getNextException(), я получаю следующее:

com.ibm.db2.jcc.am.co:НЕАТОМИЧЕСКОЕ ВСТАВЛЕНИЕ ЗАЯВЛЕНИЯ, ПЫТАЮЩЕГОСЯ НА ОБРАБОТКУ НЕСКОЛЬКИХ СТРОК ДАННЫХ, НО ОШИБКИ ПРОИЗОШЛИ

И код ошибки -4228.

Почему эта разница?Я хочу, чтобы приложение java возвращало те же подробности ошибки, что и консольный инструмент, поэтому я могу обработать эти исключения в своем коде java.

Например, если возвращенный код ошибки = -803, что означает дублирование исключения, я быобработайте мой код, чтобы выполнить обновление вместо вставки, или если возвращаемое сообщение содержит некоторые слова, такие как «FOREIGN KEY», я скажу пользователю убедиться в том, что таблицы поиска и т. д.

Я использую DB2 версии 10.5.3 в z / OS и версии драйвера DB2: 3.65.92

Ответы [ 2 ]

0 голосов
/ 28 января 2019
    } catch (SQLException ex) {
        while (ex != null) {
            if (ex instanceof com.ibm.db2.jcc.DB2Diagnosable) {
                com.ibm.db2.jcc.DB2Diagnosable db2ex = (com.ibm.db2.jcc.DB2Diagnosable) ex;
                com.ibm.db2.jcc.DB2Sqlca sqlca = db2ex.getSqlca();
                if (sqlca != null) {
                  System.out.println("SQLCODE: " + sqlca.getSqlCode());
                  System.out.println("MESSAGE: " + sqlca.getMessage());
                } else {
                  System.out.println("Error code: " + ex.getErrorCode());
                  System.out.println("Error msg : " + ex.getMessage());
                }
            } else {
              System.out.println("Error code (non-db2): " + ex.getErrorCode());
              System.out.println("Error msg  (non-db2): " + ex.getMessage());
            }
            ex = ex.getNextException();
        }
        ...
    }

Выше приведен пример обработки исключений db2.Пример вывода при двух нарушениях одновременно: уникальный ключ в таблице MYSCHEMA.MYTABLE, куда приходят пакетные вставки, и внешний ключ в родительской таблице.Я намеренно разделил его на 2 части:

До getNextException():

Код ошибки: -4229

Сообщение об ошибке: [jcc] [t4] [102] [10040] [4.19.66] ... getNextException ().ERRORCODE = -4229, SQLSTATE = null

После getNextException():

SQLCODE: -803

MESSAGE: одно или несколько значений в INSERTоператор, оператор UPDATE или обновление внешнего ключа, вызванное оператором DELETE, недопустимы, так как первичный ключ, уникальное ограничение или уникальный индекс, идентифицируемый «1», ограничивают наличие таблицы «MYSCHEMA.MYTABLE» дублирующимися значениями для ключа индекса. SQLCODE= -803, SQLSTATE = 23505, DRIVER = 4.19.66

SQLCODE: -530

MESSAGE: значение вставки или обновления клавиши FOREIGN KEY "MYSCHEMA.MYTABLE.MYTABLE_FK" не равнок любому значению родительского ключа родительской таблицы. SQLCODE = -530, SQLSTATE = 23503, DRIVER = 4.19.66

0 голосов
/ 28 января 2019

Я думаю, что сообщение об исключении из пакета довольно ясно.Учтите, что разные операторы в пакете могут не работать или выдают предупреждения по разным причинам.Таким образом, сообщение об ошибке на уровне пакета является общим и указывает вам использовать «getNextException () для извлечения исключений для определенных» операторов в пакете.

...