我有两个数据库 一个A 数据库  一个B数据库
B数据库需要同步A数据库中的数据  在A数据库中有一个中间表  通过中间表可以知道修改过哪些数据,添加了哪些数据。
每一次同步的时候数据量都能上万条。具体数目不详。估计在一万条以上,五万条以下。
我想请问下 需不需要使用游标?
如果需要使用游标该怎么使用。
对于数据库游标我还是个新手。希望各位大侠多多指点。
create or replace procedure pro_Test as
  DATA_COUNT    NUMBER;
  DATESTR       DATE; --当前系统时间
 begin
     --把系统时间付给变量DATESTR
     SELECT TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD'), 'YYYY-MM-DD')
            INTO DATESTR
                 FROM DUAL;
     begin
     通过中间表找到修改过的数据和添加的数据
      begin         
      if DATA_COUNT > 0 then
     删除在A数据库中已修改的数据
       commit;          
      end if;
  
    添加数据
       commit;
       exception when others then rollback;
       end;
   end;
end pro_Test;
如果有必要使用游标,我想500条提交一次。或者更多。
代码怎么写或者思路是怎样的。知道的大侠指点以下迷津。

解决方案 »

  1.   

    请参考一下下面贴中的方法一,其中多处用到游标及其循环:http://blog.sina.com.cn/s/blog_57527e520100w9w4.html
      

  2.   

    create or replace procedure pro_Test as
        DATA_COUNT NUMBER;
        DATESTR DATE; --当前系统时间
        
        CURSOR CUR_UPDATE IS SELECT * FROM TAB@A WHERE DATETIME = DATESTR;  -- 获取 A 库中间表记录
    begin
        --把系统时间付给变量DATESTR
        --SELECT TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD'), 'YYYY-MM-DD')
        --INTO DATESTR
        --FROM DUAL;
        DATESTR := TRUNC(SYSDATE,'DD');
        FOR UP_DATA IN CUR_UPDATE
        LOOP
            delete from tab where xx = UP_DATA.xx;
            insert into tab values(UP_DATA.xx, UP_DATA.XXX);
        END LOOP;    commit;
    end pro_Test;
      

  3.   


    如果你想每 500 条提交一次的话,可以加一个判断进去if (mod(CUR_UPDATE, 500) = 0) then 
        commit;
    end if;如果你的数据量比较大的话,事务占用资源比较多,执行到后面就会比较慢
      

  4.   


    if (mod(CUR_UPDATE%ROWCOUNT, 500) = 0) then  
      commit;
    end if;上面笔误
      

  5.   

    在B库创建A库的dblink 可直接访问A库数据表然后用MERGE INTO 语法实现数据同步操作
    MERGE INTO B库目标表 alias1 
    USING (A库源表和中间表) alias2
    ON (join condition) 
    WHEN MATCHED THEN 
        UPDATE table_name 
        SET col1 = col_val1, 
            col2     = col2_val 
    WHEN NOT MATCHED THEN 
        INSERT (column_list) VALUES (column_values); 
      

  6.   

    这种数据抽取转换批量操作 尽量不要用游标实现 能用单条SQL语句尽量用SQL语句