本帖最后由 leech125 于 2010-07-21 14:26:08 编辑

解决方案 »

  1.   

    数据多的话用cursor吧少的话,用BULK COLLECT INTO 放到关联数组中去吧
      

  2.   

    存储过程 循环语句咋么比?  用cursor的话不是同样的循环处理?如果不能直接用BULK COLLECT INTO 或者sql解决的话,用不用cursor效率差不多,也就是个方便性的问题。
      

  3.   

    如上所说。其实不用循环最快,关键是不用循环能不能解决,还有不用循环在在线运行系统的维护中一定要有限制,否则会形成阻塞,并且出现问题不好定位。那么关键点在于:BULK COLLECT INTO  与 游标,其实也有两者配合使用的。要理解两者那个快那个慢,这个并非绝对,不同的数据量,甚至于可以说数据列多少都可能会影响,所以一个是做实验,根据实际情况而论,另一个是了解下原理上的区别:1、BULK COLLECT INTO 是将数据放入内存数组中的,即,结果集中的数据先复制到内存中,然后循环过程中,无论对原表做增、删、改都无影响(其实游标也没有,除非是同一个SESSION对游标所遍历的表进行增删改操作,后面简要说明下)。2、游标其实可以理解为一个C语言的指针,不过它保存的是查询结果中的顺序号码、SCN号码等信息,也就是当你FETCH一次,从数据库中从新获取,如果被其他SESSION修改过,那么通过SCN号码到回滚段表空间提取数据,若回滚段被冲掉,就会报错,如果在同一个SESSION由于自身对游标结果集进行修改或者删除,可能会导致顺序号码错乱,此时也会报错。从这里可以基本知道两者原理上的区别,那么大致定位如果数据量较少的情况下,复制到内存中肯定是较好的选择,而如果只有10条数据呢,其实10条数据也就不存在什么性能问题,即使有性能问题也不是在循环上面,而BULK COLLECT INTO 到底怎么用呢,当你要反复用的,顺着用了反着用,很多地方要用的时候,它的优势就体现了,因为全是内存操作。最后:游标和BULK COLLECT INTO 联合使用的方式是:通过游标,每次批量提取一部分数据到内存中(如100条)语法基本规则是:
    FETCH <游标> BULK COLLECT INTO <行对象> limit 100;
    这种适合于大型数据处理过程中逐步批量的处理过程,就像是一个缓冲区一样,减少I/O的频繁交互。
      

  4.   

    哦,有关这个问题还有一个就是FORALL,它的循环提交比FOR循环优秀很多,不过仅仅局限于一个普通的DML操作,并且只有一个,依赖于的原理是告知ORACLE这些SQL为BULK BINDING(批量绑定),就像批处理一样。