Mik*_*sen 35 sql database oracle oracle11g
所以我很确定Oracle支持这个,所以我不知道我做错了什么.此代码有效:
CREATE MATERIALIZED VIEW MV_Test
NOLOGGING
CACHE
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS
SELECT V.* FROM TPM_PROJECTVERSION V;
Run Code Online (Sandbox Code Playgroud)
如果我添加一个JOIN,它会中断:
CREATE MATERIALIZED VIEW MV_Test
NOLOGGING
CACHE
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS
SELECT V.*, P.* FROM TPM_PROJECTVERSION V
INNER JOIN TPM_PROJECT P ON P.PROJECTID = V.PROJECTID
Run Code Online (Sandbox Code Playgroud)
现在我收到错误:
ORA-12054:无法为实例化视图设置ON COMMIT刷新属性
我在TPM_PROJECT和TPM_PROJECTVERSION上创建了物化视图日志.TPM_PROJECT的主键为PROJECTID,TPM_PROJECTVERSION的复合主键为(PROJECTID,VERSIONID).有什么诀窍呢?我一直在挖掘Oracle手册无济于事.谢谢!
All*_*lan 45
首先,从Oracle数据库数据仓库指南:
仅具有连接的物化视图上的快速刷新限制
...
- FROM列表中所有表的Rowid必须出现在查询的SELECT列表中.
这意味着您的语句需要看起来像这样:
CREATE MATERIALIZED VIEW MV_Test
NOLOGGING
CACHE
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS
SELECT V.*, P.*, V.ROWID as V_ROWID, P.ROWID as P_ROWID
FROM TPM_PROJECTVERSION V,
TPM_PROJECT P
WHERE P.PROJECTID = V.PROJECTID
Run Code Online (Sandbox Code Playgroud)
另一个需要注意的关键方面是必须将您的物化视图日志创建为with rowid.
以下是功能测试场景:
CREATE TABLE foo(foo NUMBER, CONSTRAINT foo_pk PRIMARY KEY(foo));
CREATE MATERIALIZED VIEW LOG ON foo WITH ROWID;
CREATE TABLE bar(foo NUMBER, bar NUMBER, CONSTRAINT bar_pk PRIMARY KEY(foo, bar));
CREATE MATERIALIZED VIEW LOG ON bar WITH ROWID;
CREATE MATERIALIZED VIEW foo_bar
NOLOGGING
CACHE
BUILD IMMEDIATE
REFRESH FAST ON COMMIT AS SELECT foo.foo,
bar.bar,
foo.ROWID AS foo_rowid,
bar.ROWID AS bar_rowid
FROM foo, bar
WHERE foo.foo = bar.foo;
Run Code Online (Sandbox Code Playgroud)
你有没有ANSI加入尝试过吗?
CREATE MATERIALIZED VIEW MV_Test
NOLOGGING
CACHE
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS
SELECT V.*, P.* FROM TPM_PROJECTVERSION V,TPM_PROJECT P
WHERE P.PROJECTID = V.PROJECTID
Run Code Online (Sandbox Code Playgroud)