合并可更新视图时的ORA-00903

时间:2014-10-31 00:01:27

标签: sql oracle oracle11g

当合并到Oracle 11gR2中的其他可更新视图时,我得到一个ORA-00903(USER_UPDATABLE_COLUMNS显示所有列可插入,可更新,可删除基础和视图)

标准插入,更新,正常删除所有工作。

文档: http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_9016.htm#SQLRF01606 有以下内容:

  

使用INTO子句指定目标表或视图   更新或插入。为了将数据合并到视图中,   视图必须是可更新的。有关更多信息,请参阅“有关可更新视图的说明”   信息。

以下示例中似乎满足可更新视图条件,但ORA-00903在所有合并尝试中都存在。对替代触发器的更改似乎对合并性没有任何影响。

CREATE TABLE MERGE_TEST_B
(MERGE_TEST_ID   NUMBER              NOT NULL PRIMARY KEY,
 MERGE_TEST_DESC VARCHAR2(50) UNIQUE NOT NULL);

CREATE OR REPLACE VIEW MERGE_TEST_V
AS
  SELECT
    MERGE_TEST_B.MERGE_TEST_ID,
    MERGE_TEST_B.MERGE_TEST_DESC
  FROM MERGE_TEST_B;

CREATE OR REPLACE TRIGGER MERGE_TEST_V_TIX
INSTEAD OF INSERT OR UPDATE OR DELETE ON MERGE_TEST_V
  FOR EACH ROW 
  BEGIN
    DBMS_OUTPUT.PUT_LINE('TESTING VIEW MERGE.');
  END;
/

我想知道是否有可以使这种观点进入可合并状态的变化,或者这是不合格的。

以下尝试失败:

MERGE INTO MERGE_TEST_V
USING
  (SELECT
     'TESTMERGE' MERGE_TEST_DESC
   FROM DUAL) TEST_DATA
ON (MERGE_TEST_V.MERGE_TEST_DESC = TEST_DATA.MERGE_TEST_DESC)
WHEN NOT MATCHED THEN INSERT
  (MERGE_TEST_ID, MERGE_TEST_DESC)
VALUES
  (-100, TEST_DATA.MERGE_TEST_DESC);

任何想法都将不胜感激。 感谢

1 个答案:

答案 0 :(得分:2)

我不确定为什么Oracle会返回ORA-00903而不是ORA-38106,但问题似乎是您的触发器。删除触发器将允许您的合并工作。

根据ORA-38106的描述,“当使用MERGE修改视图时,您必须只在视图中指定一个表,并且视图不能具有INSTEAD OF触发器。“[强调我的]

几乎埋没在合并声明的文档中,这实际上是 mentioned