2012-11-14 41 views
3

有沒有什麼辦法在第二次批量收集之後,數據不會覆蓋第一個批量收集。我不想循環迭代。Bulk通過相同的嵌套表兩次收集兩次

DECLARE 
     TYPE abc IS RECORD (p_id part.p_id%TYPE); 

     TYPE abc_nt 
     IS 
      TABLE OF abc 
      INDEX BY BINARY_INTEGER; 

     v_abc_nt  abc_nt; 
    BEGIN 
     SELECT p_id 
     BULK COLLECT 
     INTO v_abc_nt 
     FROM part 
     WHERE p_id IN ('E1', 'E2'); 

     SELECT p_id 
     BULK COLLECT 
     INTO v_abc_nt 
     FROM part 
     WHERE p_id IN ('E3', 'E4'); 

     FOR i IN v_abc_nt.FIRST .. v_abc_nt.LAST 
     LOOP 
      DBMS_OUTPUT.put_line (
      'p_id is ' || v_abc_nt (i).p_id 
     ); 
     END LOOP; 
    END; 

OUTPUT:

  • P_ID是E3
  • P_ID是E4

注:E1和E2存在於部分表。

回答

9

您不能簡單地將數據添加到集合,不。

你可以,但是,做一個BULK COLLECT到單獨的收集和再結合集合假設你真的只需要/想一個嵌套表,而不是關聯數組...

DECLARE 
    TYPE abc IS RECORD (p_id part.p_id%TYPE); 

    TYPE abc_nt 
    IS 
     TABLE OF abc; 

    v_abc_nt  abc_nt; 
    v_abc_nt2  abc_nt; 
BEGIN 
    SELECT p_id 
    BULK COLLECT 
    INTO v_abc_nt 
    FROM part 
    WHERE p_id IN ('E1', 'E2'); 

    SELECT p_id 
    BULK COLLECT 
    INTO v_abc_nt2 
    FROM part 
    WHERE p_id IN ('E3', 'E4'); 

    v_abc_nt := v_abc_nt MULTISET UNION v_abc_nt2; 

    FOR i IN v_abc_nt.FIRST .. v_abc_nt.LAST 
    LOOP 
     DBMS_OUTPUT.put_line (
     'p_id is ' || v_abc_nt (i).p_id 
    ); 
    END LOOP; 
END; 

如果你真的想要使用關聯數組,您需要編寫一些代碼,因爲如果將Oracle與另一個具有相同鍵的關聯數組結合使用時,Oracle無法自動知道如何重新映射某個數組的關聯。

+0

@Jutin洞:謝謝主席先生 –

+0

我跑相同proc在我的機器上,它給我以下錯誤:'調用'MULTISET中錯誤的數量或類型的參數_UNION_ALL'',請告訴我這是什麼問題 –

+0

@GauravSoni - 你是否改變了你的代碼來使用嵌套表而不是像我建議的那樣使用關聯數組?如果你仍然試圖使用關聯數組,你會得到這個錯誤。 –

0

你可以寫這樣的

糟糕的例子:

declare 
    type t_numb is record(
    numb number); 
    type t_numb_list is table of t_numb; 
    v_numb_list t_numb_list; 
begin 
    with q as 
    (select 1 a from dual union select 2 from dual union select 3 from dual) 
    select q.a bulk collect into v_numb_list from q; 
    with w as 
    (select 4 a from dual union select 5 from dual union select 6 from dual) 
    select w.a bulk collect into v_numb_list from w; 

    for r in 1 .. v_numb_list.count loop 
    dbms_output.put_line(v_numb_list(r).numb); 
    end loop; 
end; 

和這個作品好:

declare 
    type t_numb is record(
    numb number); 
    type t_numb_list is table of t_numb; 
    v_numb_list t_numb_list := t_numb_list(); 
    v_numb  t_numb; 
begin 
    for q in (select 1 a 
       from dual 
      union 
      select 2 
       from dual 
      union 
      select 3 
       from dual) loop 
    v_numb.numb := q.a; 
    v_numb_list.extend; 
    v_numb_list(v_numb_list.count) := v_numb; 
    end loop; 

    for w in (select 4 a 
       from dual 
      union 
      select 5 
       from dual 
      union 
      select 6 
       from dual) loop 
    v_numb.numb := w.a; 
    v_numb_list.extend; 
    v_numb_list(v_numb_list.count) := v_numb; 
    end loop; 

    for r in 1 .. v_numb_list.count loop 
    dbms_output.put_line(v_numb_list(r).numb); 
    end loop; 
end;