我有两个系统源和目标。两个系统都有相同的名称相同的表。但目标系统表的列数多于源系统表中的列数。我想将源系统转储导出到目标系统,而不更新目标系统中的新列。
ex:Source System,
T1-> name ='a',sex ='F',id = 1
目的地系统
T1-> name ='a1',sex ='F',id = 1,email = a @ b.com。
我想将转储导入到目标系统,更新t1表而不更新电子邮件字段。 我怎么能这样做?
答案 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;
您将获得打印的合并声明,您可以单独运行它以查看结果。
希望这能解决您的问题。