Question

Sous Oracle, à l'aide d'un tableau de données simple:

create table data (
    id       VARCHAR2(255),
    key      VARCHAR2(255),
    value    VARCHAR2(511));

supposons que je souhaite " insérer ou mettre à jour " une valeur. J'ai quelque chose comme:

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');

Existe-t-il un meilleur moyen que celui-ci? Cette commande semble avoir les inconvénients suivants:

  • Chaque littéral doit être saisi deux fois (ou ajouté deux fois via le paramétrage)
  • Le " using dual " la syntaxe semble hacky

Si tel est le meilleur moyen, y a-t-il moyen de régler chaque paramètre deux fois dans JDBC?

Était-ce utile?

La solution

Je ne considère pas que l'utilisation de dual soit un bidouillage. Pour vous débarrasser de la reliure / de la frappe deux fois, je voudrais faire quelque chose comme:

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);

Autres conseils

Je voudrais masquer le MERGE à l'intérieur d'une API PL / SQL, puis l'appeler via JDBC:

data_pkg.merge_data ('someid', 'testKey', 'someValue');

En guise d'alternative à MERGE, l'API peut faire:

begin
   insert into data (...) values (...);
exception
   when dup_val_on_index then
      update data
      set ...
      where ...;
end;

Je préfère essayer la mise à jour avant l'insertion pour éviter de devoir rechercher une exception.

update data set ...=... where ...=...;

if sql%notfound then

    insert into data (...) values (...);

end if;

Même maintenant que nous avons la déclaration de fusion, j'ai toujours tendance à faire des mises à jour sur une seule ligne de cette façon. Cela semble simplement une syntaxe plus naturelle. Bien entendu, la fusion prend tout son sens lorsqu'il s'agit de grands ensembles de données.

Utiliser une procédure stockée

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top