пятница, 7 июня 2013 г.

UPSERT с использованием Merge (OracleDB) / UPSERT using Merge in Oracle DB

Для чего нужен оператор Merge. Это способ объединения нескольких запросов select, Insert, Update и Delete в один. Подробнее почитать о нем можно на Oracle SQL Reference.

Ранее старался избегать оператора Merge,так как у JDBC драйвера были проблемы  с  LOB полями при использовании Merge. Но какое-то время назад решил попробовать снова, чтобы не писать код на PL\SQL или использовать несколько Statement'ов в java.


Сразу отмечу, что проблемы JDBC с LOB остались, но в остальном Merge отрабатывает прекрасно.

Решил проверить его на строках длиной до 4000 байт (VARCHAR2(4000)). 

Условия: при записи данных - должны обновиться, если существует совпадение, иначе создается новая запись.  

Параметризованный запрос (PreparedStatement) на Java:

merge into info i 
       using (select t.id as id from fstore t where t.f_id=?) d   
       on (i.store_id = d.id and i.usr = ?)  
WHEN MATCHED THEN  
       update set i.data=? 
WHEN NOT MATCHED THEN 
       insert(id,store_id, usr, data)  
            values(info_seq.nextval, d.id, ?,?);


Длинные строки отрабатывают, радует что у jdbc и PreparedStatement не возникло проблем.


Комментариев нет:

Отправить комментарий