أوراكل 10g PL / SQL- حدد النتائج كقيم العمود التحديث
سؤال
هل هناك طريقة لبسهولة / تحديث بأناقة عدة أعمدة في جدول مع القيم المسجلة من استعلام في أوراكل 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 وتحديث الجدول.