Для чего нужен оператор 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 не возникло проблем.
Ранее старался избегать оператора 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 не возникло проблем.
Комментариев нет:
Отправить комментарий