如何将数据插入PL/SQL表类型而不是PL/SQL表?

Arc*_*rcs 3 oracle plsql

我有一个TDATAMAP表,它有大约1000万条记录,我想将所有记录读取到PL/SQL表类型变量中,与一些条件匹配,最后在登台表中插入所有必需的记录.请告诉我是否可以使用PL/SQL表typle变量和BULK INSERT/COLLECT来完成它.我也担心代码的性能.

APC*_*APC 8

"我想将所有记录提取到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)

有些情况会不够好.但这是开始的方法.


Ton*_*ews 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;
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)