写了一个存储过程 功能是 把a表中的数据 行列转到b表上 其中从a表取出的数据再存储过程中要做些处理和判断
我是用游标来逐条读取a表中的200w数据。问题是 执行这个存储过程 时间非常长要2小时才执行完,commit后去b表查,发现有许多数据没有存进来。
请问 是系统内存有限制 导致不能一次commit 要分开commit 还是其他原因?
我是用游标来逐条读取a表中的200w数据。问题是 执行这个存储过程 时间非常长要2小时才执行完,commit后去b表查,发现有许多数据没有存进来。
请问 是系统内存有限制 导致不能一次commit 要分开commit 还是其他原因?
一次提交 应该也就是吃内存 不会导致丢失数据啊
oracle自身有很多机制 会触发写数据
丢失数据的问题 不好说 自己跟踪下丢失的数据吧
顶
“发现有许多数据没有存进来”这个跟数据库内存无关。这个问题建议检查一下是否程序逻辑导致的
一次commit也是可行的下面是一个使用 for all insert 和 使用 bulk collect的例子,供参考
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;
/