问题描述
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