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

Moz*_*Moz 3 oracle plsql view 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
Run Code Online (Sandbox Code Playgroud)

无法理解这里出了什么问题,我知道如果我取出 DISTINCT 子句它就可以工作,但是如果我指定必需的“REFRESH COMPLETE ON COMMIT”,为什么我不能使用“DISTINCT”。

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

tbo*_*one 5

似乎通过添加 DISTINCT,您已经使视图的底层 SQL 不符合快速刷新的条件,因此无法与 ON COMMIT 一起使用(即使您指定刷新完成而不是刷新快速)。来自Oracle 文档

两种刷新执行模式是 ON COMMIT 和 ON DEMAND。根据您创建的物化视图,某些选项可能不可用。刷新模式说明如表8-4所示。

表 8-4 刷新模式

承诺时

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

一经请求

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

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