在Oracle中对收集类型“对象”进行批量收集 程序结果

问题描述

我有一个集合类型对象

create or replace 
TYPE     "COLLECTION_OBJECT"    AS OBJECT
(
    attribute1 integer,attribute2  date,attribute2 integer,) ;

然后在我的pl / sql过程中,有一个像这样创建的收集表。

create or replace 
TYPE         "COLLECTION_TABLE"       as table of COLLECTION_OBJECT;

我正在像这样批量收集。

SELECT COLLECTION_OBJECT(attribut1,attribut3,attribute4) BULK COLLECT
  INTO result_set
  FROM TABLE(COLLECTION_TABLE)

我在pl / sql函数中以COLLECTION_OBJECT方式收集了3次数据,而上述查询是在COLLECTION_OBJECT中收集了数据之后3次将数据添加到result_set中的。

我的问题是

每次将COLLECTION_OBJECT中收集的数据批量收集到result_set还是将其累加到最后将被清除吗?

我尝试在线搜索时发现,在运行批量收集时,读取后会释放内存,但是我没有从Type对象中获得任何与批量收集相关的信息,所以我不确定。

解决方法

每次使用批量收集时,它都会清除收集并将其替换为正在收集的新数据。如果要将多个批量集合合并到一个集合中,则需要使用一个临时集合,将其收集到其中,然后使用MULTISET运算符将这些集合连接在一起。可以在下面找到一个示例。

程序

CREATE OR REPLACE TYPE COLLECTION_OBJECT AS OBJECT
(
    attribute1 INTEGER,attribute2 DATE,attribute3 INTEGER
);

CREATE OR REPLACE TYPE COLLECTION_TABLE AS TABLE OF COLLECTION_OBJECT;


DECLARE
    l_data        collection_table;
    l_temp_data   collection_table;
BEGIN
        SELECT COLLECTION_OBJECT (1,TO_DATE ('1-JAN-2020'),2)
          BULK COLLECT INTO l_data
          FROM DUAL
    CONNECT BY LEVEL <= 5;

    DBMS_OUTPUT.put_line ('1. Count: ' || l_data.COUNT);

        SELECT COLLECTION_OBJECT (1,2)
          BULK COLLECT INTO l_data
          FROM DUAL
    CONNECT BY LEVEL <= 7;

    DBMS_OUTPUT.put_line ('2. Count: ' || l_data.COUNT);

        SELECT COLLECTION_OBJECT (1,2)
          BULK COLLECT INTO l_temp_data
          FROM DUAL
    CONNECT BY LEVEL <= 10;

    l_data := l_data MULTISET UNION ALL l_temp_data;

    DBMS_OUTPUT.put_line ('3. Count: ' || l_data.COUNT);
    
    SELECT COLLECTION_OBJECT (1,2)
          BULK COLLECT INTO l_temp_data
          FROM DUAL
    CONNECT BY LEVEL <= 50;

    l_data := l_data MULTISET UNION ALL l_temp_data;

    DBMS_OUTPUT.put_line ('4. Count: ' || l_data.COUNT);
END;

结果

1. Count: 5
2. Count: 7
3. Count: 17
4. Count: 67