أوراكل دمج الثوابت في جدول واحد
سؤال
في أوراكل، في ضوء جدول بيانات بسيط:
create table data (
id VARCHAR2(255),
key VARCHAR2(255),
value VARCHAR2(511));
لنفترض أنني أريد "إدراج أو تحديث" قيمة.لدي شيء مثل:
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');
هل هناك طريقة أفضل من هذه؟يبدو أن هذا الأمر له العيوب التالية:
- يجب كتابة كل حرف حرفي مرتين (أو إضافته مرتين عبر إعداد المعلمة)
- يبدو بناء جملة "استخدام مزدوج" مخترقًا
إذا كانت هذه هي الطريقة الأفضل، فهل هناك أي طريقة لتعيين كل معلمة مرتين في JDBC؟
المحلول
لا أعتبر استخدام الثنائي بمثابة اختراق.للتخلص من الربط/الكتابة مرتين، سأفعل شيئًا مثل:
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);
نصائح أخرى
أود إخفاء الدمج داخل واجهة برمجة تطبيقات PL/SQL ثم الاتصال بذلك عبر JDBC:
data_pkg.merge_data ('someid', 'testKey', 'someValue');
كبديل لـ MERGE، يمكن لواجهة برمجة التطبيقات (API) القيام بما يلي:
begin
insert into data (...) values (...);
exception
when dup_val_on_index then
update data
set ...
where ...;
end;
أفضل تجربة التحديث قبل الإدراج لحفظ الاضطرار إلى التحقق من وجود استثناء.
update data set ...=... where ...=...;
if sql%notfound then
insert into data (...) values (...);
end if;
حتى الآن لدينا عبارة الدمج، ما زلت أميل إلى إجراء تحديثات صف واحد بهذه الطريقة - يبدو الأمر أكثر طبيعية.بالطبع، دمج يأتي حقًا في حد ذاته عند التعامل مع مجموعات بيانات أكبر.
استخدم الإجراء المخزن