Oracle fusiona constantes en una sola tabla
Pregunta
En Oracle, dada una tabla de datos simple:
create table data (
id VARCHAR2(255),
key VARCHAR2(255),
value VARCHAR2(511));
Supongamos que quiero " insertar o actualizar " un valor. Tengo algo como:
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');
¿Hay una manera mejor que esto? Este comando parece tener los siguientes inconvenientes:
- Cada literal debe escribirse dos veces (o agregarse dos veces mediante la configuración de parámetros)
- El " usando doble " la sintaxis parece hacky
Si esta es la mejor manera, ¿hay alguna manera de tener que configurar cada parámetro dos veces en JDBC?
Solución
No considero usar dual para ser un hack. Para deshacerme de enlazar / escribir dos veces, haría algo como:
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);
Otros consejos
Ocultaría el MERGE dentro de una API PL / SQL y luego lo llamaría a través de JDBC:
data_pkg.merge_data ('someid', 'testKey', 'someValue');
Como alternativa a MERGE, la API podría hacer:
begin
insert into data (...) values (...);
exception
when dup_val_on_index then
update data
set ...
where ...;
end;
Prefiero probar la actualización antes de la inserción para ahorrar tener que buscar una excepción.
update data set ...=... where ...=...;
if sql%notfound then
insert into data (...) values (...);
end if;
Incluso ahora tenemos la declaración de fusión, todavía tiendo a hacer actualizaciones de una sola fila de esta manera, simplemente parece una sintaxis más natural. Por supuesto, fusionar realmente se destaca cuando se trata de conjuntos de datos más grandes.
Utilice un procedimiento almacenado