有这样一个过程,请教如何进行一下优化:
 
     CURSOR CUR1 IS  SELECT * FROM CARD_CCD_CLAIM_TYPE;
      myRow TABLE2%ROWTYPE;
  BEGIN    OPEN CUR1;    LOOP
      Fetch CUR1 into  myRow;
      EXIT WHEN CUR1%NOTFOUND;
      
      UPDATE TABLE1 SET ROW=myRow 
      WHERE KEY = myRow.KEY;

      IF sql%rowcount = 0 THEN
 INSERT INTO TABLE1  VALUES myRow;
      END IF;      IF MOD (icount, 10000) = 0
      THEN
         COMMIT;
      END IF;    END LOOP;
    CLOSE CUR1;
    COMMIT;
END;

解决方案 »

  1.   

    优化,是现在的问题是什么?太慢了?还是:最好把表结构贴一下!这种不一定要用存存储过程!可以考虑用以下的语句:
    merge into
    ...
    when mathed then
    else
    end
      

  2.   

    merge into tj_test1 tt1
    using tj_test tt
    on (tt1.id=tt.id)
    when matched then
    update set
    tt1.name=tt.name,
    tt1.age=tt.age
    when not matched then
    insert values(
    tt.id,
    tt.name,
    tt.age)  --example
      

  3.   

    数据量大,有点慢
    表table1,table2的结构是完全一样的,只是表名不一样而已,其中key是索引
      

  4.   

    IF MOD (icount, 10000) = 0  这里设置的大些试试。这里遍历本身就存在着数据量大时的性能问题。
      

  5.   

    楼主真的可以用merge来实现用游标太慢了
      

  6.   

    本帖最后由 liuyi8903 于 2009-09-22 23:36:21 编辑
      

  7.   

    SELECT * FROM CARD_CCD_CLAIM_TYPE; 
    一定要反回所有的吗?KEY; 如果是主键的话,完全可以select KEY from ....这样可以快速扫描索引了.cost少得多.然后走key到key的update