在一个增量维护的数据库系统中,为了使插入的数据与已存在的数据不重复,需要在插入每条记录时根据关键字段的内容查询数据库中有无重复记录,如果有就使用UPDATE语句更新这条记录,如果没有就使用INSERT插入新记录。  这样的操作方式在操作少量数据时对系统的运行效率不会产生什么影响,但是一旦数据量达到两三百万的时候,每更新一条记录就要搜索一次有无重复,效率也降低很多,也曾想过使用存储过程来实现数据判断导入,客户程序只负责将数据传递给存储过程,由他来执行查询更新操作,但可能速度也不会有质的提高,能不能通过捕获ORACLE的错误提示,比如当我插入一条重复记录时,由于定义的唯一约束,数据库一定会报错,再根据这个错误代码来判断是更新还是插入。请问有人这样实现过么,愿闻其详!
或者有其它更好的解决方法!

解决方案 »

  1.   

    使用merge into效率较高
    具体语法可以google一下
      

  2.   

    使用MERGE INTO 语句
    将B中数据不重复的插入A中    MERGE INTO  A a
        USING  B b
        ON(a.XH=b.XH)
        WHEN NOT MATCHED THEN INSERT--如果不匹配则插入
        Values(b.xh,b.xm,b.zym,b.xb,b.cssj,b.zxf,b.bz);
      

  3.   

    我也遇到过类似的问题,如果你的数据量不大的话,可以用merge into 
      merge  into  ta a
      using (select  * from tb ) b
      on (a.id = b.id)
      when matched then update set a.name = b.name
      when not matched then insert (id,name)
      values ( b.id,b.name);
      
      

  4.   

    http://topic.csdn.net/u/20091221/19/958513c6-946a-4f58-a217-ed63233301d0.html?6911参见#11
      

  5.   

    如果不需要记录错误的话,用merge into,分批来更新提交。一个merge into操作几百万的数据比较慢,要是中间出错就惨了。
    可以分批比较,比如每1万merge into 一次。
    在存储过程中动态拼 merge into 语句,然后用execute immediate 来执行。如果需要记录错误的话,只能用FORALL 来一条条加sql,然后批量更新