PreparedStatement и значение 'null' в предложении WHERE - PullRequest
1 голос
/ 03 апреля 2012

Я использую PrepareStatement и BatchUpdate для выполнения запроса UPDATE. В течение цикла я создаю пакет. В конце цикла я выполняю пакет.

Приведенная выше логика работает нормально, если SQL-запрос, используемый в PrepareStatement, не имеет нулевых значений в предложениях WHERE.

Оператор обновления завершается ошибкой, если в классе WHERE есть нулевое значение.

Мой код выглядит примерно так:

connection = getConnection();

PreparedStatement ps = connection.prepareStatement(
        "UPDATE TEST_TABLE SET Col1 = true WHERE Col2 = ? AND Col3 = ?");

for (Data aa : InComingData){
    if(null == aa.getCol2()){
        ps.setNull(1, java.sql.Types.INTEGER);
    }
    else {
        ps.setInteger(1,aa.getCol2())
    }

    if(null == aa.getCol3()) {
        ps.setNull(2, java.sql.Types.INTEGER);
    }
    else {
        ps.setInteger(2,aa.getCol3())

    }
    ps.addBatch();
}

ps.executeBatch();
connection.commit();    

Любая помощь будет оценена.

Ответы [ 2 ]

4 голосов
/ 11 июня 2013

Если вы не хотите генерировать SQL динамически, вы можете использовать NVL во всех столбцах, допускающих пустые значения в вашем предложении WHERE, чтобы преобразовать null в некоторое значение, которое столбец никогда не будет содержать; и при установке переменных связывания в Statement просто конвертируйте null в то же значение, которое используется в функции NVL. Например,

String sql = "UPDATE TEST_TABLE SET Col1 = true
              WHERE NVL(Col2, -1) = ? AND NVL(Col3, -1) = ?";

А в Statement:

ps.setInt(1, aa.getCol2() == null ? -1 : aa.getCol2().intValue());
ps.setInt(2, aa.getCol3() == null ? -1 : aa.getCol3().intValue());
2 голосов
/ 03 апреля 2012

Это потому, что в SQL something = null всегда ложно, даже если something равно нулю. Чтобы сравнить столбец с нулем, вы должны использовать where col2 is null вместо where col2 = null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...