1

渡されたパラメーター値がnullの場合に列を更新しないバッチ更新を作成するにはどうすればよいですか?例えば:

String UPDATE_STMT = "UPDATE MY_TABLE SET col1 = ?, col2 = ?, col3 = ?";
Connection conn = getConnection();
PreparedStatement pstmt = conn.preparedStatement(UPDATE_STMT);

List items = getItems();
for (ItemType item : items) {

    stmt.setString(1, item.x);
    stmt.setString(2, item.y);
    stmt.setString(3, item.z);
}

pstmt.executeBatch();

item.xがnullまたは空でない場合にのみcol1がitem.xの値で更新されるようにコーディングするにはどうすればよいですか?item.xがnull/空の場合、col1フィールドの現在の値が上書きされないようにします。これは、Oracle10gデータベース用です。

4

3 に答える 3

1

私はそれがあなたのために働くはずだと思います:

String UPDATE_STMT = "UPDATE MY_TABLE SET col1 =   
CASE WHEN ? IS NULL THEN col1 ELSE ? END, col2 = ?, col3 = ?";

ここで、item.xを2回設定する必要があることに注意してください。stmt.setString(1, item.x); stmt.setString(2, item.x);

于 2012-09-17T16:36:27.390 に答える
0

alex07のOracle固有のソリューションが必要ない場合は、アイテムのセットごとにプリペアドステートメントを再生成するだけです。

Connection conn = getConnection();

List items = getItems();
for (ItemType item : items) {

    String UPDATE_STMT = "UPDATE MY_TABLE SET ";
    if (item.x != null) {UPDATE_STMT += "col1 = ?, ";}
    UPDATE_STMT += "col2 = ?, col3 = ?";

    PreparedStatement pstmt = conn.preparedStatement(UPDATE_STMT);

    int count = 0;
    if (item.x != null) {pstmt.setString(++count, item.x);}
    pstmt.setString(++count, item.y);
    pstmt.setString(++count, item.z);

    pstmt.executeBatch();
}
于 2012-09-17T17:02:46.607 に答える
0

item.xがnullの場合、COALESCEを使用してcol1を返します。

String UPDATE_STMT = "UPDATE MY_TABLE SET col1 = COALESCE(?,col1), col2 = ?, col3 = ?"

次に、必要なのは、item.xが空白の文字列ではなく、常にnullになるようにすることです。

于 2012-09-17T16:37:10.237 に答える