sobre - Constantes de fusión Oracle en una sola tabla
libros sobre youtube pdf (5)
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 mejor manera 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)
- La sintaxis "usar dual" parece hacky
Si esta es la mejor manera, ¿hay alguna forma de tener que establecer cada parámetro dos veces en JDBC?
No considero usar dual para ser un hack. Para deshacerse de la vinculación / tipeo 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);
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 del inserto para guardar la verificación de 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, la fusión realmente se fortalece cuando se trata de conjuntos de datos más grandes.
Use un procedimiento almacenado
Cuando su fuente y tabla de destino son las mismas, necesita usar DUAL.