有没有办法在第二个批量收集之后,数据不会覆盖第一个批量收集。我不想循环迭代。

    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;

输出:
  • p_id是E3
  • p_id是E4

  • 注意:零件表中包含E1和E2。

    最佳答案

    您不能简单地将数据添加到集合中,不能。

    但是,您可以将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无法自动知道如何重新映射一个数组的关联。 。

    10-06 13:43