Oracle 以更新模式从源系统导出数据并导入到目标系统
我有两个系统源和目标。两个系统具有相同名称的表的数量相同。但目标系统表的列数比源系统表的列数多。我想将源系统转储导出到目标系统,而不更新目标系统中的新列 例:源系统 T1->name='a',sex='F',id=1 目的地系统 T1->name='a1',sex='F',id=1,电子邮件=a@b.com. 我想导入转储到目标系统,更新t1表而不更新电子邮件字段。Oracle 以更新模式从源系统导出数据并导入到目标系统,oracle,plsql,Oracle,Plsql,我有两个系统源和目标。两个系统具有相同名称的表的数量相同。但目标系统表的列数比源系统表的列数多。我想将源系统转储导出到目标系统,而不更新目标系统中的新列 例:源系统 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合并列,你能给我一些代码示例吗?请看下面我更新的答案。