Constantes de fusion Oracle dans une seule table
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?
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