prepareStatement.setString (1, «null»), интерпретируется как ноль вместо строки (после prepareStatement.addBatch ()) - PullRequest
2 голосов
/ 18 апреля 2019

PreparedStatement setString принимает «ноль» (как если бы String a = "null"), а после .addBatch он превращается в обычный ноль (как если бы String a = null).

Я не знаю, как это сделатьчтобы обойти эту неверную интерпретацию, так как сразу после того, как все они были добавлены в пакетном режиме, выполняется много строк (оператор sql является INSERT INTO ...) (VarChar не может быть нулевым, но String a = "null" может бытьпринимается таблицей, если она отправлена ​​без пакета ... вся программа останавливается из-за ошибки msg с сервера)

Сообщение об ошибке: Ошибка при записи данных в базу данных ... org.netezza.error.NzSQLException: ОШИБКА: Столбец 17: Поле не может содержать нулевые значения

Код:

preparedStatement.setString(17, x); //currently x was recieved as "null"
preparedStatement.addBatch() //after other parameters were filled then this statement
preparedStatement.executeBatch(); //after the logs this statement is executed.

Надеюсь, есть быстрое решение для этого

Я использовал этот обход, но думал, что может бытьлучше ... (так как я не могу изменить значение базы данных по умолчанию или манипулировать данными ...)

if(helper.toLowerCase().equals("null"))
    helper = (helper.equals("null") ? "null ":"NULL ");

preparedStatement.setString(17, helper);

Ответы [ 2 ]

2 голосов
/ 18 апреля 2019

Имейте в виду, что я никогда не пользовался Netezza и не могу ничего попробовать. Это коллекция информации, найденная в официальной документации IBM Netezza.

Если я читаю это право, существует явное преобразование текстового значения "null", чтобы распознать отсутствие значения ... для внешней таблицы . Причина проста: внешняя таблица представляет собой плоский файл, поэтому она, вероятно, хранит все как TEXT без разделителя, но с файлом с разделителями.

Обработка отсутствия значения

В SQL запись должна содержать значение, если столбец объявлен как не нулевой. Когда запись не содержит значения для столбца, столбец считается пустым. Система предоставляет явный и неявный метод передачи нулевого значения.
- Явный метод включает в себя определенный токен в поле вместо значения. По умолчанию этот токен является словом «ноль» (без учета регистра) . Вы можете использовать опцию nullValue, чтобы заменить этот токен на любой другой алфавитный токен длиной от 1 до 4 символов . Вы можете предшествовать или следовать вхождению явного нулевого токена в нестроковом поле со смежными пробелами. Чтобы система распознала явный нулевой токен в строковом поле, токен не может иметь предшествующие или конечные соседние пробелы. Явный метод нулевого токена делает невозможным выражение строки, состоящей в точности из текста нулевого токена.

Затем мы можем увидеть ту же идею в Опция NullValue

Определяет строку, используемую для нулевого значения, с максимальной 4-байтовой строкой UTF-8. По умолчанию используется значение «NULL».

Вы можете заменить эту опцию для этой таблицы на любую другую String, но я считаю, что это просто переместит проблему ...

Итак, мое решение, установите NullValue для вашей таблицы на " " (пробел) и в вашем проекте обрежьте каждое значение, вы никогда не сможете получить " ", так как оно будет обрезано как "".

1 голос
/ 18 апреля 2019

Учитывая ваш вопрос, я думаю, что вы пытаетесь вставить строку null, если не указано иное.Простейшим решением этой проблемы было бы использование значения столбца по умолчанию в виде строки null, поэтому вам не придется беспокоиться об указании его в коде, которое может интерпретировать или не интерпретировать его как пустое.т.е. добавление ограничения к определению столбца NOT NULL DEFAULT 'null'

...