写了一个存储过程 功能是 把a表中的数据 行列转到b表上 其中从a表取出的数据再存储过程中要做些处理和判断
我是用游标来逐条读取a表中的200w数据。问题是 执行这个存储过程 时间非常长要2小时才执行完,commit后去b表查,发现有许多数据没有存进来。
请问 是系统内存有限制 导致不能一次commit 要分开commit 还是其他原因?

解决方案 »

  1.   

    逐条提交 性能不好
    一次提交   应该也就是吃内存  不会导致丢失数据啊
    oracle自身有很多机制 会触发写数据
    丢失数据的问题 不好说  自己跟踪下丢失的数据吧
      

  2.   

    这种问题是不是需要 pro C 来处理,更好一些 ~
      

  3.   

    可以分批commit;花费的这么长时间要看你的数据和过程是怎么的
      

  4.   



    “发现有许多数据没有存进来”这个跟数据库内存无关。这个问题建议检查一下是否程序逻辑导致的
    一次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;
    /