如果传入的参数值为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数据库。
答案 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();
}