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?
Решение
Я не считаю использование Dual хаком.Чтобы избавиться от привязки/ввода дважды, я бы сделал что-то вроде:
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;
Даже сейчас, когда у нас есть оператор слияния, я по-прежнему склонен выполнять обновления одной строки таким образом — просто синтаксис кажется более естественным.Конечно, слить действительно проявляется при работе с большими наборами данных.
Используйте хранимую процедуру