某些列的Pl / SQL批量迁移

时间:2013-08-30 09:06:25

标签: sql oracle plsql

我知道有很多批量插入脚本,因为我是pl / sql的新手我很困惑。 我有两个表TABLEA(id,name,sirname,age)TABLEB(id,age),我想将所有数据从TABLEB迁移到TABLEA。

我找到了一个链接http://psoug.org/reference/array_processing.html,其中“FORALL Insert”解释了如何执行此操作。但它假设两个表列类型相同。但在我的情况下,我将复制到TABLEA上的一些列。

由于TABLEB有300万条记录,因此性能非常重要。 还有一件事我想说TABLEB是外部表,我的意思是它是从txt文件映射到正确的列到表。

那么可以做些什么来为我的案例修改以下脚本。

CREATE TABLE servers2 AS
SELECT *
FROM servers
WHERE 1=2;

DECLARE
 CURSOR s_cur IS
 SELECT *
 FROM servers;

 TYPE fetch_array IS TABLE OF s_cur%ROWTYPE;
 s_array fetch_array;
BEGIN
  OPEN s_cur;
  LOOP
    FETCH s_cur BULK COLLECT INTO s_array LIMIT 1000;

    FORALL i IN 1..s_array.COUNT
    INSERT INTO servers2 VALUES s_array(i);

    EXIT WHEN s_cur%NOTFOUND;
  END LOOP;
  CLOSE s_cur;
  COMMIT;
END;

2 个答案:

答案 0 :(得分:4)

可能最快的方法是使用带有APPEND提示的普通旧INSERT:

 INSERT /*+APPEND*/ INTO table_a(id,age)
  SELECT id, age
  FROM table_b;

不需要FORALL / BULK COLLECT等。

答案 1 :(得分:0)

您不必为外部表更改任何内容。由于您有30M数据,因此可以将限制增加到100000。但它纯粹取决于您的数据库设计和您拥有的流量。但我更喜欢增加限制。