Как обойти или избежать обновления столбца при использовании подготовленного оператора в том же методе? - PullRequest
1 голос
/ 23 февраля 2012

Позвольте мне прояснить проблему - у меня есть запрос для обновления нескольких столбцов в таблице Oracle:

UPDATE MED_COM_MAPPER_CMDS SET STATUS = ?, OUTAGE_ID = ? WHERE CMD_ID = ?

Я хочу условно не обновить таблицу значений столбца OUTAGE_ID, если у меня нет определенного значения в столбце STATUS. Как я могу реализовать это в том же методе, как показано ниже? Изменения в методе приемлемы, но не слишком много. Разве нельзя сделать это тем же способом, который показан в приведенных ниже строках кода?

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

Это просто для упрощения. Это можно сделать путем переопределения запроса или метода или условий с приращением значения индекса.

Надеюсь, я был чист.

Ответы [ 3 ]

1 голос
/ 23 февраля 2012

Как насчет изменения оператора обновления, что-то вроде:

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

Если status = 'X' (существующее значение состояния, которое есть), то обновите outage_id с помощью new_val, в противном случае сохраните существующий outage_id.

1 голос
/ 23 февраля 2012

Вы можете добавить проверку NULL на входное значение: если переданное значение равно NULL, установите для значения столбца то же значение, которое у него уже есть, в противном случае установите для него переданное значение.В этом примере используется NVL от Oracle, но вы можете использовать COALESCE или что-то еще.

UPDATE MED_COM_MAPPER_CMDS SET STATUS=NVL(?, STATUS) WHERE CMD_ID=?
0 голосов
/ 23 февраля 2012

Просто используйте этот запрос:

UPDATE MED_COM_MAPPER_CMDS SET STATUS=? WHERE CMD_ID=?

Если вы хотите, чтобы это произошло условно, вы можете создать PreparedStatement, используя один из следующих двух SQL.

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...