我有一个TDATAMAP表,它有大约1000万条记录,我想将所有记录读取到PL/SQL表类型变量中,与一些条件匹配,最后在登台表中插入所有必需的记录.请告诉我是否可以使用PL/SQL表typle变量和BULK INSERT/COLLECT来完成它.我也担心代码的性能.
"我想将所有记录提取到PL/SQL表类型变量中,将其与某些条件匹配,最后在临时表中插入所有必需的记录."
这可能不是正确的方法.SQL是一种基于集合的编程语言.它具有允许我们识别和使用我们想要的记录集的功能.
所以,而不是三个阶段的过程 - 提取,过滤,插入 - 庆祝集合的乐趣:
insert into your_staging_table
select whatver
from your_10m_table
where something = your_matching_criteria;
Run Code Online (Sandbox Code Playgroud)
有些情况会不够好.但这是开始的方法.
你可以,但你可能不应该一次将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;
Run Code Online (Sandbox Code Playgroud)
以下示例使用LIMIT子句.对于循环的每次迭代,FETCH语句将100行(或更少)读取到索引表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;
Run Code Online (Sandbox Code Playgroud)