2009-08-07 3 views
4

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

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

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

+0

Предположительно вы имеете в виду "MERGE INTO

ИСПОЛЬЗОВАНИЕ ..." Синтаксис 'upserts'. Я не думаю, что вы можете это сделать, но вы можете пояснить, о чем говорите в этом вопросе. – wowest

+0

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

+0

Что вы подразумеваете под «последней вставленной или обновленной строкой»? То есть команда MERGE не имеет порядка в том, как она будет обрабатывать данные. Я не уверен, что полезно знать, что последняя запись в случайном расположении данных. Возможно, вы могли бы предоставить схему и утверждение Merge для оценки? –

ответ

0

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

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

1

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

+0

А до триггера вставки можно удалить все в глобальной таблице темп. «После вставки для каждой строки» может записывать введенные данные. – redcayuga

2

Как заявляет APC, «В отличие от INSERT синтаксис Oracle MERGE не поддерживает предложение RETURNING. Увы».

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

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

1

После прочтения этого примера краткий момент отказа, в поисках какого-то способа сделать эту работу с утверждением 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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^