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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top