zoukankan      html  css  js  c++  java
  • oracle数据表数据同步公用方法

     自己写了个数据同步的方法,两个数据库之间的数据同步,自己可以通过调用存储过程,添加作业实现定时同步数据。

    CREATE OR REPLACE PROCEDURE Data_sync_Common(tableName in varchar2) is
      v_sql             VARCHAR2(20000); --????SQL
      pk_col_name       VARCHAR2(800); --主键SQL
      insert_col_name_A VARCHAR2(20000); --A表字段
      insert_col_name_B VARCHAR2(20000); --B表字段
      update_col_name   VARCHAR2(20000); --更新字段
      dsql              VARCHAR2(20000);
      local_col_in      VARCHAR2(20000);
      TYPE cur_type IS REF CURSOR;
      cur_not_contain_col cur_type;
      CURSOR CR1 IS
    
      -- select 'alter table '||table_name||' disable constraint '||constraint_name as dsql
        SELECT table_name, constraint_name
          FROM user_constraints
         WHERE constraint_type = 'R'
           AND table_name = upper(tableName);
    BEGIN
      SELECT to_char(WMSYS.WM_CONCAT('''' || column_name || ''''))
        INTO local_col_in
        FROM user_tab_cols
       WHERE table_name = upper(tableName);
    
      dsql := 'SELECT * FROM user_tab_cols@testjob_dblink1 WHERE table_name=''' ||
              upper(tableName) || ''' AND column_name not IN(' || local_col_in || ')';
      dbms_output.put_line(dsql);
      OPEN cur_not_contain_col FOR dsql;
    
      SELECT REPLACE(to_char(WMSYS.WM_CONCAT(' AND a.' || cu.COLUMN_NAME ||
                                             '=b.' || cu.COLUMN_NAME)),
                     ',',
                     '')
        INTO pk_col_name
        FROM user_cons_columns cu, user_constraints au
       WHERE cu.constraint_name = au.constraint_name
         AND au.constraint_type = 'P'
         AND au.table_name = upper(tableName);
    
      IF (pk_col_name IS NULL) OR (LENGTH(pk_col_name) < 6) THEN
        SELECT REPLACE(to_char(WMSYS.WM_CONCAT(' and a.' || cu.COLUMN_NAME ||
                                               '=b.' || cu.COLUMN_NAME)),
                       ',',
                       '')
          INTO pk_col_name
          FROM user_cons_columns cu, user_constraints au
         WHERE cu.constraint_name = au.constraint_name
           AND au.constraint_type = 'U'
           AND au.table_name = upper(tableName);
      END IF;
    
      SELECT to_char(WMSYS.WM_CONCAT('b.' || column_name))
        INTO insert_col_name_B
        FROM user_tab_cols
       WHERE table_name = upper(tableName);
    
      SELECT to_char(WMSYS.WM_CONCAT('a.' || column_name))
        INTO insert_col_name_A
        FROM user_tab_cols
       WHERE table_name = upper(tableName);
    
      SELECT to_char(WMSYS.WM_CONCAT('a.' || column_name || '=b.' ||
                                     column_name))
        INTO update_col_name
        FROM user_tab_cols
       WHERE table_name = upper(tableName)
         AND column_name NOT IN
             (SELECT cu.COLUMN_NAME
                FROM user_cons_columns cu, user_constraints au
               WHERE cu.constraint_name = au.constraint_name
                 AND au.constraint_type = 'P'
                 AND au.table_name = upper(tableName));
    
      v_sql := 'MERGE INTO ' || upper(tableName) || '@testjob_dblink1 a USING ' || upper(tableName) ||
               ' b' || '
                ON (' || substr(pk_col_name, 6, length(pk_col_name)) || ')';
       dbms_output.put_line(update_col_name);
      IF (update_col_name IS NOT NULL) AND (LENGTH(update_col_name) > 0) THEN
        v_sql := v_sql || ' when matched then
            update set ' || update_col_name;
      END IF;
      v_sql := v_sql || '
               when not matched then
               insert (' || insert_col_name_A || ') values( ' ||
               insert_col_name_B || ')';
    
    
      dbms_output.put_line(v_sql);
      EXECUTE immediate(v_sql);
      EXCEPTION
      WHEN OTHERS THEN
      dbms_output.put_line(sqlerrm);
    
    END Data_sync_Common;
    -----------------------------调用上述存储过程
    CREATE OR REPLACE PROCEDURE DATA_sync is
    BEGIN
    data_sync_common('TEST_SYNC');
    COMMIT;
    EXCEPTION 
      WHEN  OTHERS  THEN 
        ROLLBACK ;
    END  DATA_sync;
    
  • 相关阅读:
    操作系统之磁盘结构笔记
    Linux 操作系统位数(32or64)识别
    手把手教你mysql(十)索引
    Linux命令 — 设置或查看网络配置命令ifconfig
    字符数组的排列
    android 加载图片防止内存溢出
    eCos系统CPU负载测量
    模糊控制——理论基础(4模糊推理)
    模糊控制——理论基础(3模糊关系及其运算)
    模糊控制——理论基础(2隶属函数)
  • 原文地址:https://www.cnblogs.com/zchunhua/p/5409276.html
Copyright © 2011-2022 走看看