从源系统导出数据并以更新模式导入目标系统

时间:2017-12-08 06:15:25

标签: oracle plsql

我有两个系统源和目标。两个系统都有相同的名称相同的表。但目标系统表的列数多于源系统表中的列数。我想将源系统转储导出到目标系统,而不更新目标系统中的新列。

ex:Source System,

T1-> name ='a',sex ='F',id = 1

目的地系统

T1-> name ='a1',sex ='F',id = 1,email = a @ b.com。

我想将转储导入到目标系统,更新t1表而不更新电子邮件字段。 我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

请在下面找到我在我的示例数据上运行的代码。请在您的环境中运行它并检查它是否能解决您的问题。

几个假设:
 1.)目标模式名称是@Target_Schema。(在代码中将@Target_schema替换为您的目标模式名称)
 3.)源表格中的每个表格都应该更新PK  4.)确保源中的表没有复合PK
 5.)您应该在TGT模式中为您更新或插入的特定表格提供DML特权。

代码:

    CREATE TABLE ANK1  
            (
            ID NUMBER,  
            NAME VARCHAR2(4000),
            );  

            ALTER TABLE ank1
            ADD CONSTRAINT ANK_PK PRIMARY KEY (ID);  

            insert into ANK1   values(1,'abc');
            commit;

           CREATE TABLE @Target_Schema.ANK1
            (
           ID NUMBER,
           NAME VARCHAR2(4000),
           EMAIL VARCHAR2(4000)
           );  


    SET SERVEROUTPUT ON
declare
p_key_col varchar2(40);
l_merge_sql varchar2(4000);
begin
for cur_tab in ( SELECT * FROM (
SELECT UTC.TABLE_NAME,UTC.COLUMN_NAME,UCC.COLUMN_NAME AS PK_COL  FROM USER_TAB_COLS UTC,USER_CONSTRAINTS UC,USER_CONS_COLUMNS UCC WHERE UTC.TABLE_NAME IN ('ANK1')
AND UTC.TABLE_NAME = UC.TABLE_NAME AND UC.CONSTRAINT_TYPE = 'P' AND UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME) WHERE PK_COL <> COLUMN_NAME ) loop


    l_merge_sql:= 'MERGE INTO @Target_Schema.'||cur_tab.table_name||' T_TABLE
     USING '||cur_tab.table_name||' SRC
        ON (T_TABLE.'||cur_tab.PK_COL||' = SRC.'||cur_tab.PK_COL||')

     WHEN MATCHED THEN
          UPDATE
             SET T_TABLE.'||cur_tab.COLUMN_NAME||' = SRC.'||cur_tab.COLUMN_NAME||'

     WHEN NOT MATCHED THEN
          INSERT (T_TABLE.'||cur_tab.PK_COL||', T_TABLE.'||cur_tab.COLUMN_NAME||')
          VALUES (SRC.'||cur_tab.PK_COL||', SRC.'||cur_tab.COLUMN_NAME||')';
    DBMS_OUTPUT.PUT_LINE(l_merge_sql);

 END LOOP;

 END;

您将获得打印的合并声明,您可以单独运行它以查看结果。

希望这能解决您的问题。