【问题标题】:Why does a ORA-12054 error occur when creating this simple materialized view example?为什么在创建这个简单的物化视图示例时会出现 ORA-12054 错误?
【发布时间】:2012-02-11 14:38:04
【问题描述】:
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 没有问题,但这些不是要求。

【问题讨论】:

  • 你有一个唯一的索引。不需要独特的,为什么要打扰它呢?
  • 也许这个例子不是最好的,因为我想将视图扩展到一个需要不同关键字的更复杂的查询,现在我只是想让它在基本级别上工作.
  • DISTINCT 根本没有任何意义。选择中的ID 列将导致所有行始终不同。
  • 好的,对于 OP 来说很好。 8 年后我碰巧在这里,我有一个案例我确实需要DISTINCT,所以这解决了我的问题;只是不能使用ON COMMIT

标签: oracle plsql views materialized-views


【解决方案1】:

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

两种刷新执行模式是 ON COMMIT 和 ON DEMAND。取决于 在您创建的物化视图上,某些选项可能不是 可用的。表 8-4 描述了刷新模式。

表 8-4 刷新模式

提交时

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

按需

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

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

【讨论】:

    【解决方案2】:

    “也许这个例子不是最好的,因为我想扩展视图 到需要不同关键字的更复杂的查询, 现在我只是想让它在基本层面上工作。 "

    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,但您必须修改查询的逻辑或刷新策略。

    【讨论】:

    • 例如,如果我正在运行搜索并且想要填充组合框。我可以使用“SELECT DISTINCT GENRE FROM APPS;”保留物化视图的缓存。为什么不能设置像这样的物化视图以在提交时刷新?我知道我不能,但我对原因和其他可用选项感兴趣。
    【解决方案3】:

    关于这个问题需要注意的重要一点是,它不是关于快速刷新,而是完全刷新。因此,除了所有引用的对象都必须是本地的之外,没有任何逻辑上的理由来应用提交时快速刷新的常规限制。

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

    【讨论】:

      猜你喜欢
      • 2016-11-22
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 2022-01-11
      相关资源
      最近更新 更多