Получение значения первичного ключа после команды слияния? - PullRequest
4 голосов
/ 07 августа 2009

Есть ли способ получить значение из последней вставленной или обновленной строки?

Я использую команду слияния для вставки или обновления, если строка существует. Я знаю, как получить автоматически сгенерированный ключ после вставки, но могу ли я получить первичный ключ, если я использую команду слияния?

Я использую Java с JDBC и Oracle DB.

Ответы [ 4 ]

2 голосов
/ 19 августа 2009

Как говорит APC: "В отличие от INSERT, синтаксис Oracle MERGE не поддерживает предложение RETURNING. Увы."

Боюсь, самый простой ответ на это - реализовать вашу бизнес-логику как функцию PL / SQL, которая реализует вашу бизнес-логику и возвращает интересующее вас значение.

Разбиение процесса на шаги в PL / SQL, чтобы проверить, существует ли уже существующая строка, не должно быть слишком медленным, как вы должны (я полагаю) делать прямой поиск по первичному ключу (или, по крайней мере, по уникально индексируемому столбцу)

1 голос
/ 12 июня 2014

Прочитав это, испытав краткий момент отказа, ища какой-то способ сделать это с помощью оператора MERGE, затем, наконец, приняв комментарий APC, я остановился на следующей альтернативе, которая может быть полезна кому-то еще:

public List upsert(String updateSql, String insertSql, Map data){
  List ids = new ArrayList();
  Map params = new HashMap();
  params.put("name", data.get("name"));
  if(data.get("personId") != null){
    params.put("personId", data.get("personId"));
    int rowCount = jdbcTemplate.update(updateSql, params);
    if(rowCount == 1){
      ids.add(data.get("personId"));
    }
  }else{
    keyHolder = new GeneratedKeyHolder();
    int rowCount = jdbcTemplate.update(insertSql, params, keyHolder);
    if(rowCount == 1){
      ids.add(keyHolder.getKey().intValue());
    }
  }
  return ids;
}
1 голос
/ 14 августа 2009

Долгосрочный вариант: вы можете написать в базе данных триггер, который пометит время любого обновления или вставки, и поместить метку времени в новый столбец, который вы назовете: последний измененный (или что-то в этом роде). Затем закажите по этому столбцу, чтобы получить последнюю отредактированную строку.

0 голосов
/ 07 августа 2009

Я решил эту проблему, используя слои персистентности более высокого уровня. Мое решение состоит в том, чтобы сделать вставку, затем получить полученный идентификатор и обновить строку. Я понимаю, что это не оптимально, но мне еще предстоит найти лучшее решение.

Однако я обнаружил, что часто комбинация столбцов без первичного ключа приводит к уникальной строке. Если вы можете идентифицировать эти данные в базе данных, я рекомендую установить уникальное ограничение для столбцов, чтобы они гарантированно были уникальными. Если у вас есть другой способ доступа к уникальным строкам, вы можете использовать его для объединения.

...