在ORACLE 9i 的存储过程中用FOR……LOOP语句进行100万条的数据循环处理,有没有问题? 内存吃不吃得消?
要不要改写成显式开关闭游标的循环语句? 谢谢!FOR …… LOOP语句代码参考:
    CURSOR  cur_tbl_sa01
    IS
    SELECT
        cust_no,
        ……
      FROM    tbl_sa01;    rec_tbl_sa01_data       cur_tbl_sa01%ROWTYPE;    ……    FOR rec_tbl_sa01_data IN cur_tbl_sa01 LOOP
        ……
    END LOOP;其中表tbl_sa01有100万条数据。
假设内存是1~2G另: FOR ……  LOOP隐式打开关闭游标语句和以下显式开关闭游标语句有差别吗?特别是在处理大数据量的表时。
     OPEN cur_tbl_sa01;
     WHILE NOT cur_tbl_sa01%NOT_FOUND
         FETCH cur_tbl_sa01 INTO rec_tbl_sa01_data;
         ……
     END
     CLOSE cur_tbl_sa01;本例中FOR …… LOOP语句需不需要改写成 OPEN游标 循环FETCH数据 CLOSE游标 的语句?

解决方案 »

  1.   

    请问rolandzhang()为什么写成显式打开、关闭比较好?两者有什么差别?谢谢赐教!在FOR …… LOOP方式下,其实在循环外的错误处理部分还是对打开的游标进行了关闭。那这样一来两者还有没有差别?
      

  2.   

    测试结果出来了!测试结果:FOR rec~ IN cur~ LOOP …处理… END LOOP方式下利用ORACLE系统隐式打开和关闭游标,效率上来说稍微优于用户自己显式打开和关闭游标的语句(OPEN游标  循环FETCH数据处理  CLOSE游标)。
    而且前一种方式语句显得稍简单一些。
    以下是测试环境和测试数据,请参考:CPU: (两块296MHz的CPU)
    Mar 17 17:15:18 JCIRIUS-SERVER rootnex: [ID 466748 kern.info] root nexus = Sun Enterprise 450 (2 X UltraSPARC-II 296MHz)MEMORY:(1G内存)
    1024MTEST TABLE:(用来测试的表有255个字段)
    TEST_TBL (255 Fields)RECORD NUMBERS:(测试表TEST_TBL中有100多万条数据记录)
    1000100FOR ... LOOP SPEND TIMES:(FOR ... LOOP隐式打开和关闭游标方式下读完全部数据,只是累加计数,没有做别的操作,共耗时21分3秒)
    21'03''OPEN CUR, LOOP FETCH ... END LOOP CLOSE CUR SPEND TIMES:
    用户自己显式打开和关闭游标的语句: OPEN游标  循环FETCH出数据处理(只是累加计数),  CLOSE游标,该方式下读完全部数据,耗时28分21秒)
    28'21''