我有一个TDATAMAP表,它有大约1000万条记录,我想将所有记录读取到PL / SQL表类型变量中,将其与某些条件匹配,最后将所有必需的记录插入到临时表中。请告诉我是否可以使用PL / SQL表typle变量和BULK INSERT / COLLECT来完成它。我也担心代码的性能。
答案 0 :(得分:8)
“我想将所有记录提取到PL / SQL表类型变量中, 将它与某些标准匹配,最后插入所有必需的 登台表中的记录。“
这可能不是正确的方法。 SQL是一种基于集合的编程语言。它具有允许我们识别和使用我们想要的记录集的功能。
因此,不是三个阶段的过程 - 提取,过滤,插入 - 庆祝集合的乐趣:
insert into your_staging_table
select whatver
from your_10m_table
where something = your_matching_criteria;
有些情况会不够好。但这是开始的方法。
答案 1 :(得分:7)
你可以,但你可能不应该一次将1000万条记录加载到内存中 - 只要有足够的内存来容纳那么多内存。通常,BULK COLLECT与LIMIT子句一起使用,一次处理有限数量的行,例如1000。
BULK COLLECT子句允许您从结果中获取整个列 一次设置,或整个结果集。以下示例, 从游标中检索列到集合中:
DECLARE
TYPE NameList IS TABLE OF emp.ename%TYPE;
names NameList;
CURSOR c1 IS SELECT ename FROM emp WHERE job = 'CLERK';
BEGIN
OPEN c1;
FETCH c1 BULK COLLECT INTO names;
...
CLOSE c1;
END;
以下示例使用LIMIT子句。随着每次迭代 在循环中,FETCH语句将100行(或更少)读取到index-by中 表acct_ids。之前的值将被覆盖。
DECLARE
TYPE NumList IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
CURSOR c1 IS SELECT acct_id FROM accounts;
acct_ids NumList;
rows NATURAL := 100; -- set limit
BEGIN
OPEN c1;
LOOP
/* The following statement fetches 100 rows (or less). */
FETCH c1 BULK COLLECT INTO acct_ids LIMIT rows;
EXIT WHEN c1%NOTFOUND;
...
END LOOP;
CLOSE c1;
END;