سؤال

في أوراكل، في ضوء جدول بيانات بسيط:

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;

حتى الآن لدينا عبارة الدمج، ما زلت أميل إلى إجراء تحديثات صف واحد بهذه الطريقة - يبدو الأمر أكثر طبيعية.بالطبع، دمج يأتي حقًا في حد ذاته عند التعامل مع مجموعات بيانات أكبر.

استخدم الإجراء المخزن

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top