oracle中,我有2个表: 表A和表B,表B比表A多2个字段,其他字段完全一样,我想把A中的数据全部导入到B。
oracle中,我有2个表:表A和表B,表B比表A多2个字段,其他字段完全一样,我想把表B中的数据全部导入到表A。表B的数据量有1000W条,如果用insertintoa...
oracle中,我有2个表: 表A和表B,表B比表A多2个字段,其他字段完全一样,我想把表B中的数据全部导入到表A。表B的数据量有1000W条,如果用 insert into a (a,b,c)select a,b,c from B 这样把插入不了。还有其他别的办法么。
展开
5个回答
2013-01-17
展开全部
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;
/
-- 定义游标.
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;
/
展开全部
我估计是你类型不一样,或者是长度设置不同或者是有其他约束之类的,
你插入的时候报什么错。
你插入的时候报什么错。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这语句没有问题,为什么插入不了?是加为数据量太多?数据量太多就加一个条件分段处理。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
加个索引吧,别无他求了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
insert into a select a,b,c from b 这个测试可行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询