有两个数据库A(172.10.10.234)和B(156.2.10.254)分别在不同地方,可以远程连接到,
里面有一张表结构相同,要做同步,组长说了句以前用物化视图做数据同步,我晚上找了半天也找不到个像样的例子,
请问高手,如何做数据同步呢?最好带个定时更新job,希望可以给源码

解决方案 »

  1.   

    物化视图本身就自带了job定时刷的
      

  2.   

    下面是一个示例,你自己参照着写
    CREATE MATERIALIZED VIEW foreign_customers FOR UPDATE
       AS SELECT * FROM sh.customers@remote cu
       WHERE EXISTS
         (SELECT * FROM sh.countries@remote co
          WHERE co.country_id = cu.country_id);
      

  3.   


    CREATE MATERIALIZED VIEW "SYNCHRO_ENT_BASE"
    BUILD IMMEDIATE
    REFRESH FORCE
    ON DEMAND
    START WITH TO_DATE('3-11-2011 10:42:00','dd-mm-yyyy hh24:mi:ss')
    NEXT SYSDATE + 1
    WITH PRIMARY KEY
    AS
    SELECT * FROM ENT_BASE a WHERE NOT EXISTS(SELECT * FROM ENT_BASETEMP b WHERE a.entid = b.entid)现在已经查出数据到视图里了,怎么插入到ENT_BASETEMP里呢 还有SYSDATE + 1代表加多少时间了?
      

  4.   

    sysdate + 1 是加 1 天时间你 basetemp 表用来干嘛的?
      

  5.   

    哦那个是我做测试的把base里的数据定时同步到temp里 可是现在只在视图里 怎么弄到temp里
      

  6.   

    你直接把物化视图名叫 basetemp 不就好了,还再转一次湾干嘛
      

  7.   

    不是呀,.,,我是想把base里的数据同步添加到temp里,实际中是两个库里的同名表,我这是自己测试的写了,现在数据在视图里,不知道怎么添加到temp表里(实际中的另一个库表),要写job吗?怎么写呢,大侠帮忙,oracle很不熟悉
      

  8.   

    那你这个需求根本就不是物化视图,一个普通作业就可以了
    下面这个示例是一个小时处理一次的作业
    你自己改时间间隔declare
        jobid       integer;
    begin
      sys.dbms_job.submit(job => jobid,
                          what => 'execute immediate ''truncate table basetemp'';insert into basetemp select * from base@remote; commit;',
                          next_date => to_date('03-11-2011 11:11:11', 'dd-mm-yyyy hh24:mi:ss'),
                          interval => 'trunc(sysdate, ''hh24'') + 1/24');
      commit;
    end;
    /
      

  9.   

    非常感谢呀 
    组长说什么物化视图+job的...我也不清楚,物化视图一般什么地方用? 
      

  10.   

    两个库要做 dblink,就像我示例里面用的 base@remote 
    物化视图跟普通视图比的差别就在于,物化视图的数据是实实在在保存在数据文件里的
    其实,对你的需求来说,你只需要创建一个针对远程服务器 base 表的一个物化视图(不需要另外一张表)以后所有的操作都在物化视图上来做就可以了,像示例中的,每次清空数据再重新插入,这个性能比物化视图低很多普通视图,在使用的时候,实际还是查的原始表的数据,并不保存数据
      

  11.   

    额 还得弄dblink...谢谢你了
      

  12.   


    DECLARE
       job_no_  NUMBER;   
    BEGIN   
       DBMS_JOB.SUBMIT(job_no_,
                       'insert_Prod;',             -- 一般会将 insert into 语句写到一个存储过程insert_Prod中
               sysdate,
                       'TRUNC(sysdate)+1+2/24');     -- 2/24 每天凌晨2点
       COMMIT;
    END; 这是网上找的job 这么写就报错了,看你写的job里是:
    interval => 'trunc(sysdate, ''hh24'') + 1/24'
    这么多引号,为什么这些写就不报错呢?我想改成每周3执行一次,不知道怎么改呀,不知道引号加哪