为什么在创建这个简单的物化视图示例时会出现ORA-12054错误?

时间:2012-01-16 17:14:39

标签: oracle plsql views materialized-views

ALTER TABLE RECORDINGS ADD PRIMARY KEY (ID);

CREATE MATERIALIZED VIEW LOG ON RECORDINGS TABLESPACE USERS NOLOGGING;

DROP MATERIALIZED VIEW REC_SEARCH_TEST;
CREATE MATERIALIZED VIEW REC_SEARCH_TEST
REFRESH COMPLETE ON COMMIT
AS (
    SELECT DISTINCT ID, TITLE FROM RECORDINGS
);


ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view

无法理解这里有什么问题,我知道如果我拿出DISTINCT子句就可以了,但是如果我指定'REFRESH COMPLETE ON COMMIT',为什么我不能使用'DISTINCT'。

如果我按需使用DISTINCT和REFRESH没有问题,但这些不是要求。

3 个答案:

答案 0 :(得分:2)

似乎添加了DISTINCT,您已使视图的基础SQL不适合快速刷新,因此无法与ON COMMIT一起使用(即使您指定刷新完成而不是快速刷新)。来自Oracle docs

  

两个刷新执行模式为ON COMMIT和ON DEMAND。根据   在您创建的物化视图上,某些选项可能不是   可用。表8-4介绍了刷新模式。

表8-4刷新模式

ON COMMIT

  

当修改其中一个的事务时,会自动刷新   物化视图的详细信息表提交。 可以指定   只要物化视图可快速刷新(换句话说,   不复杂)。使用此模式需要ON COMMIT权限。

ON DEMAND

  

当用户手动执行其中一个可用时,会发生刷新   刷新DBMS_MVIEW包中包含的过程(REFRESH,   REFRESH_ALL_MVIEWS,REFRESH_DEPENDENT)。

同一文档链接也有一个快速刷新限制列表。

答案 1 :(得分:1)

  

“也许这个例子不是最好的,因为我想扩展视图   更复杂的查询需要一个不同的关键字,   现在我只是想让它在基础水平上运作。 “

DISTINCT是ORA-12054的原因。

SQL> CREATE MATERIALIZED VIEW REC_SEARCH_TEST
    REFRESH COMPLETE ON COMMIT
    AS (
       SELECT DISTINCT empno, ename FROM emp
   )
/
  2    3    4    5    6  
       SELECT DISTINCT empno, ename FROM emp
                                         *
ERROR at line 4:
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view


Elapsed: 00:00:01.14
SQL> SQL> 
SQL> CREATE MATERIALIZED VIEW REC_SEARCH_TEST
    REFRESH COMPLETE ON COMMIT
    AS (
       SELECT empno, ename FROM emp
   )
/
  2    3    4    5    6  
Materialized view created.

Elapsed: 00:00:02.33
SQL> 

为什么不从开始使用的东西开始?删除DISTINCT。让你的MView工作。然后在必要时将其复杂化。

虽然您已经知道不能使用DISTINCT,但您必须修改查询的逻辑或刷新策略。

答案 2 :(得分:-1)

关于这个问题需要注意的重要一点是,快速刷新,但完全刷新。因此,除了所有引用的对象必须是本地的一个限制之外,没有逻辑上的原因可以应用通常的提交快速刷新限制。

“提交时刷新完成是一个相对较新的功能,因此对”为什么“问题的最佳答案可能是”Oracle尚未完全实现这一点,请检查Oracle数据库的未来版本“。不是很有用,但是真...