zchunhua

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

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;

 

分类:

技术点:

相关文章: