假设有下面的逻辑
 DECLARE 
 CURSOR EMP_CURSOR SELECT * FROM TEST;             --TEST(ID,NAME,SAL),ID为主键
 BEGIN
 OPEN EMP_CURSOR
 LOOP
 FETCH EMP_CURSOR INTO V_ID,V_NAME,V_SAL;
 EXIT WHEN EMP_CURSOR%NOTFOUND;
 UPDATE TEST SET SAL=SAL+100 WHERE ID=V_ID;
 COMMIT;                 -----------第一个
 END LOOP;
 CLOSE EMP_CURSOR;
 --COMMIT;               -----------第二个
 END;COMMIT写在第一个地方和第2个地方有什么区别?????
是不是说写在第一个地方 就是 每更新一行 COMMT后就释放资源,并将更新后的数据永久保存??第二个地方是说
 更新完所有的行后,释放资源,并将更新后数据永久保存???俩者哪个性能更好???????????????????

解决方案 »

  1.   

    没有绝对的永远正确的事情,如果游标内的记录数不多,应该是第二位置好,不过放在第一个位置也看不出对性能的影响有多大.
    如果游标内的记录数很多,比如上亿条,那么就要考虑一下什么时候commit比较合适了,我一般的做法是每更新:2000条commit一次
      

  2.   

    建议lz看一下《Wrox-Oracle专家高级编程-Expert_one-on-one_Oracle》这本书。里面有对commit的讨论。你的问题应该是commit的问题不必要带上游标。
      

  3.   

    如果是大数据量的操作,比如上百万级别的cursor,建议还是放在里面,如果数据量很小再放在外面。要综合考虑undo空间大小和commit的效率(提交也耗时间的)。
      

  4.   

    同意楼上。再说两点,
    1。看数据库的能力,如果大级别的COMMIT,建议1000~10000个UPDATE后COMMIT一次,
    2。如果真实的程序像你所写的这么简单,那么不需要写这个LOOP,直接用一句UPDATE完成就可以。注意如果UPDATE数据量太大,就要考虑数据库的能力,主要是IO的能力,IBM 8100S可以一小时UPDATE大概7000万以上的数据。