2012-04-03 2 views
1

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

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

Заявление об обновлении выходит из строя, если в классе 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

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

+0

Спасибо за respone. Но какие изменения я должен сделать, чтобы заставить его работать? – bond

+0

Хорошо, постройте свой SQL-запрос динамически в зависимости от нулевой аргументации. –

4

Если вы не хотите, чтобы генерировать 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());