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;
/
温馨提示:答案为网友推荐,仅供参考