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

Oracle 以更新模式从源系统导出数据并导入到目标系统,oracle,plsql,Oracle,Plsql,我有两个系统源和目标。两个系统具有相同名称的表的数量相同。但目标系统表的列数比源系统表的列数多。我想将源系统转储导出到目标系统,而不更新目标系统中的新列 例:源系统 T1->name='a',sex='F',id=1 目的地系统 T1->name='a1',sex='F',id=1,电子邮件=a@b.com. 我想导入转储到目标系统,更新t1表而不更新电子邮件字段。 如何才能做到这一点?请在下面找到我的代码,它是我在示例数据上运行的。请在您的环境中运行它,并检查它是否解决了您的问题 一些假设:

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

例:源系统

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

目的地系统

T1->name='a1',sex='F',id=1,电子邮件=a@b.com.

我想导入转储到目标系统,更新t1表而不更新电子邮件字段。
如何才能做到这一点?

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

一些假设: 1.目标架构名称为@TARGET\u SCHEMA。在代码中,将@Target_schema替换为目标架构名称 3.源架构中的每个表都应该有一个要更新的PK。 4.确保源中没有表具有复合主键 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;
您将得到一个打印的合并语句,您可以单独运行该语句以查看结果


希望这能解决你的问题

你有多少张桌子。如果只有一个表,你可以合并它有50多个表,那么你必须创建一个过程,将输入作为源、目标表、表的主键,并使用动态SQL合并列,你能给我一些代码示例吗?请看下面我更新的答案。