2014-10-16 19 views
5

İki koleksiyon birleştirmem gerekiyor. İki tablonun birleştirilebileceğini biliyorum, ancak koleksiyonlardan emin değilim. Koleksiyonları birleştirmenin en iyi yolu nedir? İki listeleri/koleksiyonlarıOracle'da koleksiyonları birleştirme?

list1 obj_test_list ; 
list2 obj_test_list ; 
list3 obj_test_list ; 


list1   
id val 
1 100 
2 200 
3 300 


list2  
id val 
1 300 
4 500 

ben kimliği temel LIST1 ve List2 maç ve insert başka Val eklemek istediğiniz var örnek kod

------------ 
CREATE OR REPLACE TYPE obj_test AS OBJECT(
id number(9), 
val number (9) 
) 
/

CREATE OR REPLACE TYPE obj_test_list AS TABLE OF obj_test 
/

aşağıda Say. Bunu liste3'te aşağıdaki gibi istiyorum.

list3 
id val 
1 400 
2 200 
3 300 
4 500 

Birisi bunun için örnek bir kod verebilir mi?

cevap

2

, onlar DB tabloları günkü gibi eğer gibi SQL ifadelerini kullanarak koleksiyonlarını işleyebilirsiniz.

DECLARE 

    list1 obj_test_list := obj_test_list(obj_test(1,100),obj_test(2,200),obj_test(3,300)); 
    list2 obj_test_list := obj_test_list(obj_test(1,300),obj_test(4,500)); 
    list3 obj_test_list; 
    indx PLS_INTEGER; 

BEGIN 

    SELECT obj_test(id,NVL(T1.val,0)+NVL(T2.val,0)) 
      BULK COLLECT INTO list3 
      FROM TABLE(list1) T1 FULL OUTER JOIN TABLE(list2) T2 USING(id); 

    indx := list3.FIRST; 
    WHILE(indx IS NOT NULL) 
    LOOP 
     DBMS_OUTPUT.PUT(list3(indx).id); 
     DBMS_OUTPUT.PUT(' '); 
     DBMS_OUTPUT.PUT_LINE(list3(indx).val); 
     indx := list3.NEXT(indx); 
    END LOOP; 

END; 
: testine

1 400 
2 200 
3 300 
4 500 

Tam kod: Bu Liste3 yedekleyecekleri,

SELECT obj_test(id,NVL(T1.val,0)+NVL(T2.val,0)) 
     BULK COLLECT INTO list3 
     FROM TABLE(list1) T1 FULL OUTER JOIN TABLE(list2) T2 USING(id); 

senin iki örnek listesini Verilen: Senin durumunda, örneğin, bir FULL OUTER JOIN gerçekleştirmek için

2

Koleksiyonlar SQL ile birleştirilebilir. Koleksiyonları oluşturun, koleksiyonları tablolara dönüştürün, tabloları birleştirin ve ardından tabloları tekrar bir koleksiyona dönüştürün.

Bu içten içe inline görünümü mantık akışıyla ilk karşılaştığınızda bu zor olabilir. Özellikle nesne türleri, çapraz birleştirmeler ve döküm/toplama gibi gelişmiş özellikler ile. İzlemenize yardımcı olmak için adımlar numaralandırılmış ve yazılmıştır. Bu şekilde bir sorgu oluşturmanın avantajı, hata ayıklamanın daha kolay olmasıdır. Ortadan başlayın, IDE'nizde bir sorgu bloğunu vurgulayın ve çalıştırın ve tüm sorguyu anlayana kadar hareket etmeye devam edin. TABLE() operatörü kullanarak

--#4: Create new collection of results. 
select cast(collect(obj_test(id, val)) as obj_test_list) 
from 
(
    --#3: Join lists and add results - returns results in normalized format. 
    select 
    coalesce(list_1_normalized.id, list_2_normalized.id) id, 
    coalesce(list_1_normalized.val, 0) + coalesce(list_2_normalized.val, 0) val 
    from 
    (
    --#2a: List 1 normalized. 
    select id, val 
    from 
    (
     --#1a: List 1 objects. 
     select obj_test_list(obj_test(1,100),obj_test(2,200),obj_test(3,300))list 
     from dual 
    ) list_1_objects 
    cross join table(list_1_objects.list) 
) list_1_normalized 
    full outer join 
    (
    --#2b: List 2 normalized. 
    select id, val 
    from 
    (
     --#1b: List 2 objects. 
     select obj_test_list(obj_test(1,300),obj_test(4,500))list 
     from dual 
    ) list_2_objects 
    cross join table(list_2_objects.list) 
) list_2_normalized 
    on list_1_normalized.id = list_2_normalized.id 
); 
İlgili konular