Java 在同一方法中使用准备好的语句时,如何绕过或避免列更新?

Java 在同一方法中使用准备好的语句时,如何绕过或避免列更新?,java,sql,oracle,Java,Sql,Oracle,让我澄清一下问题-我有一个查询用于更新Oracle表中的一些列: UPDATE MED_COM_MAPPER_CMDS SET STATUS = ?, OUTAGE_ID = ? WHERE CMD_ID = ? 我希望有条件地不更新中断ID列值表,除非状态列中有特定值。如何在如下所示的相同方法中实现这一点?对方法的更改是可以接受的,但不会太多。用下面代码行显示的相同方法不可能做到这一点吗 Connection connection = DatabaseUtil.getConnection()

让我澄清一下问题-我有一个查询用于更新Oracle表中的一些列:

UPDATE MED_COM_MAPPER_CMDS SET STATUS = ?, OUTAGE_ID = ? WHERE CMD_ID = ?
我希望有条件地不更新
中断ID
列值表,除非
状态
列中有特定值。如何在如下所示的相同方法中实现这一点?对方法的更改是可以接受的,但不会太多。用下面代码行显示的相同方法不可能做到这一点吗

Connection connection = DatabaseUtil.getConnection();
preparedStatement.setInt(1, Integer.parseInt(status));

// On a condition, how can i avoid updating this column value.
// That means keep intact what it is in the DB.
preparedStatement.setString(2, outage_id); 
preparedStatement.setString(3, cmd_id);

int i = preparedStatement.executeUpdate();
connection.commit();
这只是为了让事情变得简单。可以通过重写查询或方法,或者通过增加索引值的if条件来完成

希望我已经说清楚了。

只需使用以下查询:

UPDATE MED_COM_MAPPER_CMDS SET STATUS=? WHERE CMD_ID=?
如果希望有条件地执行此操作,可以使用以下两个SQL之一创建
PreparedStatement

final String SQL1 = "UPDATE MED_COM_MAPPER_CMDS SET STATUS=? WHERE CMD_ID=?";
final String SQL2 = "UPDATE MED_COM_MAPPER_CMDS SET STATUS=?, OUTAGE_ID=? WHERE CMD_ID=?";


Connection connection=DatabaseUtil.getConnection();

if(condition) {
    PreparedStatement statement = connection.prepareStatement(SQL1);
    statement.setInt(1, Integer.parseInt(status));
    statement.setString(2, cmd_id);
    int i = statement.executeUpdate();
} else {
    statement.setInt(1, Integer.parseInt(status));
    statement.setString(2, outage_id);
    statement.setString(3, cmd_id);
    int i = statement.executeUpdate();
}

connection.commit();

如何更改update语句,例如:

UPDATE MED_COM_MAPPER_CMDS 
SET STATUS = :stat, 
OUTAGE_ID = decode(status, 'X', :new_val, outage_id)
WHERE CMD_ID = blah
;

如果状态='X'(即现有状态值),则使用新值更新中断id,否则保留现有中断id。

您可以对输入值添加空检查:如果传入值为空,则将列值设置为其已具有的相同值,否则将其设置为传入值。本例使用Oracle的NVL,但您可以使用COALESCE或其他方法

UPDATE MED_COM_MAPPER_CMDS SET STATUS=NVL(?, STATUS) WHERE CMD_ID=?

我想,我的问题不清楚。条件为不更改查询。使用相同的查询,但不更新中断\u id列/。那么您建议什么解决方案。只需编写另一个方法。检查单个列的if条件。如果有超过20列并随机选择它们来更新该列或不更新该列如何?你从来没有说过。你不能动态地这么做。如果您成功地做到了这一点,您将根本无法从容器提供的预处理语句缓存中获益。想想看。如果在列中使用相同的值进行更新,会出现什么问题?要获取状态列的现有值,在此之前,我需要运行SELECT查询。对吗?@Hari Nope,与tbone的响应相同。要获取中断ID列的现有值,在此之前我需要运行SELECT query。是吗?@Hari不,这是更新的一部分,你不再需要选择或传递任何其他内容。Oracle将知道为此where子句返回的每一行的现有中断标识值,并且只有在现有状态字段='X'时,才会将中断标识更新为“new\u val”