oracle中,我有2个表: 表A和表B,表B比表A多2个字段,其他字段完全一样,我想把A中的数据全部导入到B。

oracle中,我有2个表: 表A和表B,表B比表A多2个字段,其他字段完全一样,我想把表B中的数据全部导入到表A。表B的数据量有1000W条,如果用 insert into a (a,b,c)select a,b,c from B 这样把插入不了。还有其他别的办法么。

DECLARE
-- 定义游标.
CURSOR c_test_main IS
SELECT a,b,c FROM B;
v_rowCount INT;
BEGIN

v_rowCount := 0;
FOR test_rec IN c_test_main
LOOP
INSERT INTO A (a,b,c)
VALUES (test_rec.a, test_rec.b, test_rec.c);

-- 计数器.
v_rowCount := v_rowCount + 1;

-- 每一万行提交一次
IF( v_rowCount >= 10000 ) THEN
v_rowCount := 0;
COMMIT;
END IF;
END LOOP;

-- 最后提交一次
COMMIT;
END;
/

你可以根据需要 调整, 具体多少行 提交一次.

--------------------
上面的 PL/SQL 可能存在性能问题, 因为是 一行一行 处理的。性能差了一些。

下面的 PL/SQL 使用 Oracle 的 BULK COLLECT 技术。
Oracle BULK COLLECT在数据量很大的时候,能够显著提升性能。

DECLARE
-- 定义游标.
CURSOR c_test_main IS
SELECT a,b,c FROM B;

-- 定义类型
TYPE test_type IS TABLE OF B%ROWTYPE;
test_data test_type;

BEGIN
-- 打开游标.
OPEN c_test_main;

-- 开始循环
LOOP
-- 填充数据 批量填充,每次读取 10000 条.
FETCH c_test_main
BULK COLLECT INTO test_data LIMIT 1000;

-- FORALL 插入
FORALL i IN test_data.FIRST..test_data.LAST
INSERT INTO A (a,b,c)
VALUES (test_data(i).a, test_rec(i).b, test_rec(i).c);

-- 每 10000 条提交一次.
COMMIT;

-- 当没有数据的时候,退出。
EXIT WHEN c_test_main%NOTFOUND;
END LOOP;

-- 关闭游标.
CLOSE c_test_main;

-- 最后提交一次 COMMIT;
END;
/
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-16
我估计是你类型不一样,或者是长度设置不同或者是有其他约束之类的,
你插入的时候报什么错。
第2个回答  2013-01-16
这语句没有问题,为什么插入不了?是加为数据量太多?数据量太多就加一个条件分段处理。
第3个回答  2013-01-20
加个索引吧,别无他求了本回答被提问者采纳
第4个回答  2013-01-16
insert into a select a,b,c from b 这个测试可行
相似回答