2012-04-03 18 views
1

私は、UPDATEクエリを実行するためにPrepareStatementとBatchUpdateを使用しています。 forループでは、バッチを作成します。ループの終わりに私はバッチを実行します。WHERE節のPreparedStatementと 'null'値

上記のロジックは、PrepareStatementで使用されるSQLクエリがWHERE文節でnull値を持たない場合に有効です。

WHERE句にNULL値がある場合、Update文は失敗します。

私のコードは次のようになり、

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

これは、somethingがnullの場合でも、SQLではsomething = nullが常に偽であるためです。ヌルと列を比較するには、where col2 = nullの代わりにwhere col2 is nullを使用する必要があります。あなたは動的SQLを生成したくない場合は

+0

感謝。しかし、私はそれを動作させるために何をすべきですか? – bond

+0

さて、あなたの引数のヌルネスに応じて動的にSQLクエリを構築してください。 –

4

、あなたは列が含まれていないことをいくつかの値にnullを変換するために、あなたのWHERE句内のすべてのNULL可能列でNVLを使用することができます。 Statementにバインド変数を設定すると、nullNVL関数で使用されるのと同じ値に変換するだけです。例えば、

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

そしてStatementで:responeため

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