ORA-12054: 无法为实体化视图设置 ON COMMIT 刷新属性

根据项目需求,需要创建一个增量更新的物化视图,语法如下:
CREATE MATERIALIZED VIEW LOG ON A WITH PRIMARY KEY ;
CREATE MATERIALIZED VIEW LOG ON B WITH PRIMARY KEY ;

CREATE MATERIALIZED VIEW MV_TEST
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS
SELECT
A.COL1,B.COL1
FROM A,B
WHERE A.COL2 = B.COL2;
结果出现ORA-12054: 无法为实体化视图设置 ON COMMIT 刷新属性。

第1个回答  推荐于2017-10-07
这个提示相当模糊,google到yangtingkun的blog,发现了查找详细原因的方法。
http://yangtingkun.itpub.net/post/468/13318

Oracle提供的DBMS_MVIEW.EXPLAIN_MVIEW过程可以帮助你快速定位问题的原因。下面通过一个例子来说明,如果通过这个过程来解决问题。
使用EXPLAIN_MVIEW 过程首先要建立MV_CAPABILITIES_TABLE表,建表的脚步是$ORACLE_HOME/rdbms/admin /utlxmv.sql。(EXPLAIN_MVIEW过程是两个过程的重载,一个输出到MV_CAPABILITIES_TABLE表,另一个以PL /SQL的VARRAY格式输出,为了简单起见,我们建立MV_CAPABILITIES_TABLE表)。
SQL> begin
2 dbms_mview.explain_mview('SELECT
3 A.COL1,B.COL1
4 FROM A,B
5 WHERE A.COL2 = B.COL2;');
6 end;
7 /
通过select capability_name, possible, msgtxt from mv_capabilities_table
where capability_name like 'REFRESH%';
可以查找出原因

经查,我这段sql错误原因是“物化视图日志没有基于rowid;物化视图引用的字段没有包含所有关联表的rowid”。
修改sql为:
CREATE MATERIALIZED VIEW LOG ON A WITH ROWID ;
CREATE MATERIALIZED VIEW LOG ON B WITH ROWID ;

CREATE MATERIALIZED VIEW MV_TEST
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS
SELECT
A.COL1,B.COL1,A.ROWID AID,B.ROWID BID
FROM A,B
WHERE A.COL2 = B.COL2;本回答被提问者采纳
相似回答