来自两个不同架构的MERGE表

时间:2018-04-10 08:30:04

标签: oracle sql-merge ora-00904

我有两个来自两个不同架构的相同表,已经创建了架构之间的db链接。模式B(旧)中的表需要合并到模式A(新)。两个模式之间的表结构是相同的,除了模式A中存在另一个时间戳列。合并时,时间戳值默认为SYSDATE。

当我尝试在架构B中运行以下脚本时,它会抱怨

  

ORA-00904:“A”。“LAST_UPDATED_TIMESTAMP”:标识符无效

MERGE INTO LOOKUP_RANGE A
USING (SELECT RANGE_NAME,RANGE_TYPE,RANGE_MIN,RANGE_MAX,RANGE_DESC FROM LOOKUP_RANGE) B
ON (A.RANGE_NAME = B.RANGE_NAME AND A.RANGE_TYPE = B.RANGE_TYPE)
WHEN MATCHED THEN UPDATE SET A.RANGE_MIN = B.RANGE_MIN, A.RANGE_MAX = B.RANGE_MAX,A.LAST_UPDATED_TIMESTAMP = SYSDATE,A.RANGE_DESC = B.RANGE_DESC
WHEN NOT MATCHED THEN INSERT (A.RANGE_MIN,A.RANGE_MAX,A.LAST_UPDATED_TIMESTAMP,A.RANGE_DESC) VALUES (A.RANGE_MIN,A.RANGE_MAX,SYSDATE,A.RANGE_DESC);

ON中的键列是表的主键。 我是在错误的架构中执行的吗?它应该在架构A中运行吗?

1 个答案:

答案 0 :(得分:0)

以下代码完美无缺。 B_MIG_61_TO_74是创建的数据库链接,OLD是旧模式的模式名称,NEW是新模式的模式名称

MERGE INTO NEW.LOOKUP_RANGE A USING (SELECT RANGE_NAME,RANGE_TYPE,RANGE_MIN,RANGE_MAX,RANGE_DESC FROM OLD.LOOKUP_RANGE@DB_MIG_61_TO_74) B ON (A.RANGE_NAME = B.RANGE_NAME AND A.RANGE_TYPE = B.RANGE_TYPE) WHEN MATCHED THEN UPDATE SET A.RANGE_MIN = B.RANGE_MIN, A.RANGE_MAX = B.RANGE_MAX,A.LAST_UPDATED_TIMESTAMP = SYSDATE,A.RANGE_DESC = B.RANGE_DESC WHEN NOT MATCHED THEN INSERT (A.RANGE_NAME,A.RANGE_TYPE,A.RANGE_MIN,A.RANGE_MAX,A.LAST_UPDATED_TIMESTAMP,A.RANGE_DESC) VALUES (B.RANGE_NAME,B.RANGE_TYPE,B.RANGE_MIN,B.RANGE_MAX,SYSDATE,B.RANGE_DESC);