2012-04-03 6 views
1

Ich verwende PrepareStatement und BatchUpdate für die Ausführung einer UPDATE-Abfrage. In for-Schleife erstelle ich einen Batch. Am Ende der Schleife führe ich Batch aus.PreparedStatement und Nullwert in der WHERE-Klausel

Die obige Logik funktioniert einwandfrei, wenn die SQL-Abfrage, die in PrepareStatement verwendet wird, in WHERE-Werten keine Nullwerte enthält.

Update-Anweisung schlägt fehl, wenn in der WHERE-Clasue ein Nullwert vorhanden ist.

Mein Code sieht ungefähr so ​​aus,

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();  

Jede Hilfe würde geschätzt.

Antwort

2

Das liegt daran, dass in SQL something = null immer falsch ist, auch wenn something null ist. Um eine Spalte mit Null zu vergleichen, müssen Sie where col2 is null statt where col2 = null verwenden.

+0

Vielen Dank für respone. Aber was soll ich tun, damit es funktioniert? – bond

+0

Nun, bauen Sie Ihre SQL-Abfrage dynamisch abhängig von der Ungültigkeit Ihrer Argumente. –

4

Wenn Sie nicht SQL wollen dynamisch generieren, können Sie NVL auf allen Nullable-Spalten in Ihrer WHERE Klausel verwenden null in einen Wert zu konvertieren, dass die Spalte nie enthalten; und während Sie die Bind-Variablen in Statement setzen, konvertieren Sie einfach null in denselben Wert wie in der Funktion NVL. Zum Beispiel

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

Und in Statement:

ps.setInt(1, aa.getCol2() == null ? -1 : aa.getCol2().intValue()); 
ps.setInt(2, aa.getCol3() == null ? -1 : aa.getCol3().intValue());