从远程库同步字段到本地库

来源:互联网 发布:淘宝宝贝失效了已付款 编辑:程序博客网 时间:2024/06/05 17:03

业务库:afsp_hf_2017
平台库:FASP_1502

目标:业务库中基础数据表添加字段 year varchar2(4)、 province varchar2(9)

从平台库同步这两个字段的值
1.查询需要同步的业务库中基础数据表
select * from t_dictable t where t.tablecode like ‘%T_PUB%’;
2.判断平台库中是否存在这样的表:(注意在平台库中查询表的时候表名为FASP_+业务库中表名)
不存在:直接创建字段
存在:
平台库是否存在这两个字段(year、province)
平台库不存在:直接跳过
平台库存在:业务库中基础数据表添加字段、同步字段值

    --本地表名格式    T_PUB_AAA、T_PUB_BBB.....
    --平台表格式    FASP_T_PUB_AAA、FASP_T_PUB_BBB...

1.在本地库创建dblink;
2.写存储过程

CREATE OR REPLACE PACKAGE BODY PKG_FASP2ADDPROVINCE IS   PROCEDURE FASP2ADDPROVINCE   IS      CTABLE RCURSOR;      TABLENAME VARCHAR2(200);      TABLECOUNT NUMBER(4);      COLUMNCOUNT NUMBER(4);      COLUMNCOUNT_CURRENT  NUMBER(4);      SSQL         VARCHAR2(2000);   BEGIN     --1.循环凭证注册的基础数据表     OPEN CTABLE FOR SELECT T.TABLECODE FROM T_DICTABLE T WHERE T.TABLECODE LIKE 'T_PUB%';     LOOP           FETCH CTABLE INTO TABLENAME;           EXIT WHEN CTABLE%NOTFOUND;           --2.判断表中有没有字段           SSQL := 'SELECT COUNT(1) FROM user_tab_cols WHERE TABLE_NAME = '''||TABLENAME||''' AND (COLUMN_NAME = ''PROVINCE'')';           EXECUTE IMMEDIATE SSQL INTO COLUMNCOUNT_CURRENT;           IF COLUMNCOUNT_CURRENT=0 THEN             --当前库中没有字段直接添加             SSQL := 'ALTER TABLE '||TABLENAME ||' ADD PROVINCE VARCHAR2(9)';             EXECUTE IMMEDIATE SSQL;           END IF;             --判断平台2有没有该表           SSQL := 'SELECT COUNT(1) FROM user_tables@fasp_1502 T WHERE T.TABLE_NAME = ''FASP_'||TABLENAME||'''';           EXECUTE IMMEDIATE SSQL INTO TABLECOUNT;           IF TABLECOUNT>0 THEN             --有表再判断是否有字段             SSQL := 'SELECT COUNT(1) FROM user_tab_cols@fasp_1502 WHERE TABLE_NAME = ''FASP_'||TABLENAME||''' AND (COLUMN_NAME = ''PROVINCE'')';             EXECUTE IMMEDIATE SSQL INTO COLUMNCOUNT;             IF COLUMNCOUNT>0 THEN--平台表中的存在字段               SSQL := 'UPDATE '||TABLENAME||' T SET T.PROVINCE = (SELECT F.PROVINCE FROM FASP_1502.FASP_'||TABLENAME||' F  WHERE F.STATUS = 1 AND F.CODE = T.CODE)';               EXECUTE IMMEDIATE SSQL;             END IF;           END IF;           --2.判断表中有没有字段           SSQL := 'SELECT COUNT(1) FROM user_tab_cols WHERE TABLE_NAME = '''||TABLENAME||''' AND (COLUMN_NAME = ''YEAR'')';           EXECUTE IMMEDIATE SSQL INTO COLUMNCOUNT_CURRENT;           IF COLUMNCOUNT_CURRENT=0 THEN             --当前库中没有字段直接添加             SSQL := 'ALTER TABLE '||TABLENAME ||' ADD YEAR VARCHAR2(4)';             EXECUTE IMMEDIATE SSQL;           END IF;             --判断平台2有没有该表           SSQL := 'SELECT COUNT(1) FROM user_tables@fasp_1502 T WHERE T.TABLE_NAME = ''FASP_'||TABLENAME||'''';           EXECUTE IMMEDIATE SSQL INTO TABLECOUNT;           IF TABLECOUNT>0 THEN             --有表再判断是否有字段             SSQL := 'SELECT COUNT(1) FROM user_tab_cols@fasp_1502 WHERE TABLE_NAME = ''FASP_'||TABLENAME||''' AND (COLUMN_NAME = ''YEAR'')';             EXECUTE IMMEDIATE SSQL INTO COLUMNCOUNT;             IF COLUMNCOUNT>0 THEN--平台表中的存在字段               SSQL := 'UPDATE '||TABLENAME||' T SET T.YEAR = (SELECT F.YEAR FROM FASP_1502.FASP_'||TABLENAME||' F  WHERE F.STATUS = 1 AND F.CODE = T.CODE)';               EXECUTE IMMEDIATE SSQL;             END IF;           END IF;              END LOOP;      --commit;   END ;END PKG_FASP2ADDPROVINCE;   

注意:
上面这段代码的 FASP_1502.表名, 用到的是orcl的schema;
user_tables@fasp_1502 则用的是数据的dblink;

--部分sqlSSQL := 'UPDATE '||TABLENAME||' T SET T.YEAR = (SELECT F.YEAR FROM FASP_1502.FASP_'||TABLENAME||' F  WHERE F.STATUS = 1 AND F.CODE = T.CODE)';--部分sqlSSQL := 'SELECT COUNT(1) FROM user_tables@fasp_1502 T WHERE T.TABLE_NAME = ''FASP_'||TABLENAME||'''';
阅读全文
0 0
原创粉丝点击