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

时间:2012-02-10 11:59:55

标签: oracle plsql

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

2 个答案:

答案 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。

来自documentation

  

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;