Oracle объединяет константы в одну таблицу
В Oracle дана простая таблица данных:
create table data (
id VARCHAR2(255),
key VARCHAR2(255),
value VARCHAR2(511));
Предположим, я хочу "вставить или обновить" значение. У меня есть что-то вроде:
merge into data using dual on
(id='someid' and key='testKey')
when matched then
update set value = 'someValue'
when not matched then
insert (id, key, value) values ('someid', 'testKey', 'someValue');
Есть ли лучший способ, чем этот? Эта команда, кажется, имеет следующие недостатки:
- Каждый литерал должен быть напечатан дважды (или добавлен дважды через установку параметров)
- "Использование двойного" синтаксиса кажется неприличным
Если это лучший способ, то есть ли способ установить каждый параметр дважды в JDBC?
4 ответа
Я не считаю использование двойного хаком. Чтобы избавиться от связывания / ввода дважды, я бы сделал что-то вроде:
merge into data
using (
select
'someid' id,
'testKey' key,
'someValue' value
from
dual
) val on (
data.id=val.id
and data.key=val.key
)
when matched then
update set data.value = val.value
when not matched then
insert (id, key, value) values (val.id, val.key, val.value);
Я бы спрятал MERGE внутри API PL/SQL, а затем вызвал бы это через JDBC:
data_pkg.merge_data ('someid', 'testKey', 'someValue');
В качестве альтернативы MERGE API может сделать:
begin
insert into data (...) values (...);
exception
when dup_val_on_index then
update data
set ...
where ...;
end;
Я предпочитаю попробовать обновление перед вставкой, чтобы сохранить необходимость проверки исключения.
update data set ...=... where ...=...;
if sql%notfound then
insert into data (...) values (...);
end if;
Даже теперь у нас есть оператор слияния, я все еще склонен делать однострочные обновления таким способом - просто более естественный синтаксис. Конечно, слияние действительно вступает в свои права при работе с большими наборами данных.