Oracle:MERGE INTO包含隐形列

时间:2016-10-25 07:34:26

标签: oracle merge invisible

我遇到ORA-00904的问题:标识符无效。

例如: 我有一个像这样的表:

    CREATE TABLE TEST_TABLE
    (
      COL_1     VARCHAR2(5 CHAR) NOT NULL,
      COL_2     VARCHAR2(30 CHAR),
      COL_3     RAW(16) INVISIBLE DEFAULT SYS_GUID ()
    )
    CREATE UNIQUE INDEX TEST_TABLE_PK ON TEST_TABLE
    (COL_1);

远程数据库(DBLINK:testdb)上的第二个表如下所示:

CREATE TABLE TEST_TABLE
(
  COL_1     VARCHAR2(5 CHAR) NOT NULL,
  COL_2     VARCHAR2(30 CHAR)
)
CREATE UNIQUE INDEX TEST_TABLE_PK ON TEST_TABLE
    (COL_1);

在下一步中,我想将本地和远程数据库之间的数据合并为一个合并到这样的语句:

MERGE INTO TEST_TABLE@testdb target
        USING (SELECT * FROM TEST_TABLE 
                WHERE COL_3 = '3F47613050860B4EE0539D0A10AC10B7') source
           ON (target.COL_1 = source.COL_1)
   WHEN MATCHED
   THEN
      UPDATE SET target.COL_2 = source.COL_2
   WHEN NOT MATCHED
   THEN
      INSERT     (COL_1, COL_2)
          VALUES (source.COL_1, source.COL_2);

merge into语句不起作用,因为ORA-00904:“A5”.COL_3无效标识符。但是如果COL_3列可见,则相同的merge into语句可以正常工作。 “A5”来自哪里? 问题出在这里?有没有人有同样的问题?

Oracle版本:本地数据库为12cSE,远程数据库为11g。

1 个答案:

答案 0 :(得分:0)

用名称COL_1和COL_2指定您选择的 source 表。 关键是摆脱 SELECT * from

MERGE INTO TEST_TABLE@testdb target
        USING (SELECT COL_1,COL_2 FROM TEST_TABLE 
                WHERE COL_3 = '3F47613050860B4EE0539D0A10AC10B7') source
           ON (target.COL_1 = source.COL_1)
   WHEN MATCHED
   THEN
      UPDATE SET target.COL_2 = source.COL_2
   WHEN NOT MATCHED
   THEN
      INSERT     (COL_1, COL_2)
          VALUES (source.COL_1, source.COL_2);