批量收集两次相同的嵌套表

Gau*_*oni 5 oracle plsql oracle11g bulk-collect

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

    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;
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

  • p_id是E3
  • p_id是E4

注意:E1和E2出现在零件表中.

Jus*_*ave 11

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

但是,您可以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;
Run Code Online (Sandbox Code Playgroud)

如果你真的想使用关联数组,你需要编写一些代码,因为当你将一个数组与具有一些相同键的另一个关联数组组合时,Oracle无法自动知道如何重新映射一个数组的关联. .