أوراكل 10g PL / SQL- حدد النتائج كقيم العمود التحديث

StackOverflow https://stackoverflow.com/questions/1003011

  •  05-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة لبسهولة / تحديث بأناقة عدة أعمدة في جدول مع القيم المسجلة من استعلام في أوراكل 10g؟

ولدي جدول (نسميها المصدر) التي لديها من أجل البساطات، 2 الأعمدة، ID وKEY.

ID     Key
----   ---- 
1        1000
2        1000
3        5000
4        1000
..
101      8000
102      9000
103      7000
104      9000
...
201         5
202         5
...

ولدي جدول آخر (يطلق عليه KeyMap) أن يأخذ trunc(ID/100) ويستخدم على أنها batchID مع الأعمدة كونها خريطة الرئيسية للمعرفات ضمن الدفعة:

trunc(ID/100)   key1   key2   key3   key4 ..... key99
-------------   ----   ----   ----   ----
0               1000   1000   5000   1000
1               8000   9000   7000   9000
2                  5      5               

ومعرف يتم إنشاء وتجهيز على دفعات، وذلك في ختام تجهيز دفعة وأود أن استدعاء إجراء مخزن لتحديث سجل في الجدول KeyMap مع القيم Key جديدة مع البيان 1 التحديث باستخدام الفرعية حدد أو جمع تقديم تلك القيم الأساسية.

هل هذا ممكن وما هو أفضل / أنجع وسيلة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

وسوف تحد من انتقادي أن نقول إن تصميم الجدول الخاص بك ليست طبيعية، وليست جميلة جدا، ولكن سوف أفترض أن يكون لديك أسبابك. أنا عادة قيام هذه الاستعلامات "التناوب" باستخدام DECODE جنبا إلى جنب مع عمود الكلي، تجمع بواسطة مفتاح بلدي - في هذه الحالة، لديك الزائفة مفتاح، TRUNC (ID / 100). مع أن الجمع بين بناء الجملة التحديث الذي يستخدم الصفوف:

 UPDATE Foo
    SET (a, b, c, d)
      = (w, x, y, z);

ووتحصل على:

  UPDATE KeyMap
     SET
       ( key1
       , key2
       , key3
       , key4
       ...
       , key99
       )
       = ( SELECT MAX(decode(mod(ID, 100), 1, Key, NULL))
                , MAX(decode(mod(ID, 100), 2, Key, NULL))
                , MAX(decode(mod(ID, 100), 3, Key, NULL))
                , MAX(decode(mod(ID, 100), 4, Key, NULL))
                ...
                , MAX(decode(mod(ID, 100), 99, Key, NULL))
             FROM Source
            WHERE Trunc(Source.ID / 100) = KeyMap.batchId
            GROUP BY Trunc(Source.ID / 100)
         )
   WHERE BatchId = <x>;

نصائح أخرى

هل يمكن أن يولد VARRAY و تمر في المفاتيح الخاصة بك في دفعة واحدة. الإجراء الخاص بك يمكن تكرار عبر VARRAY وتحديث الجدول.

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