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没有问题,但这些不是要求。
答案 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数据库的未来版本“。不是很有用,但是真...