在Java中执行SQL批处理更新,如果传入的parm为null,则不会更新字段

时间:2012-09-17 16:23:07

标签: java sql oracle batch-file prepared-statement

如果传入的参数值为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或为空时才会使用item.x的值更新col1?如果item.x为null / empty,我不希望覆盖col1字段中的当前值。这适用于Oracle 10g数据库。

3 个答案:

答案 0 :(得分:1)

我想它应该适合你:

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

注意,现在您需要设置item.x两次,stmt.setString(1, item.x); stmt.setString(2, item.x);

答案 1 :(得分:0)

如果item.x为null,则使用COALESCE返回col1:

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

然后您需要做的就是确保item.x始终为null,而不是空字符串。

答案 2 :(得分:0)

如果您不想要alex07's Oracle specific solution,只需为每组项目重新生成准备好的语句。

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