所以我非常肯定甲骨文支持这一点,所以我不知道我做错了什么.此代码可以工作:

CREATE MATERIALIZED VIEW MV_Test
  NOLOGGING
  CACHE
  BUILD IMMEDIATE 
  REFRESH FAST ON COMMIT 
  AS
    SELECT V.* FROM TPM_PROJECTVERSION V;

如果我添加连接,它会断开:

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

现在我得到了一个错误:

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

我已经在TPM_PROJECT和TPM_PROJECTVERSION上创建了materialized 视图日志(log).TPM_PROJECT的主键为PROJECTID,TPM_PROJECTVERSION的复合主键为(PROJECTID,VERSIONID).这有什么诀窍?我一直在翻阅甲骨文的手册,但一无所获.谢谢

推荐答案

首先,从Oracle Database Data Warehousing Guide:

Restrictions on Fast Refresh on Materialized Views with Joins Only

...

  • "发件人"列表中所有表的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

另一个需要注意的关键方面是,materialized 视图日志(log)必须创建为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;

Database相关问答推荐

如何替换对象数组内的数组元素

1-2400之间格式奇怪的时间数据

如何使用 SQL Server 中的round方法将浮点数转换为 int?

何时将数据库称为嵌入式数据库?

如何更改 Heroku 中的列类型?

什么是 Scalar标量查询?

被删除的行占用的空间会被重新使用吗?

NameError:设置更改为 mysql 后未定义名称_mysql

归档实时 MySQL 数据库的最佳方式

显示包含特定表的所有数据库名称

在 MySQL 中 Select 浮点数

什么是数据库中的死锁?

Android 上的测试数据库:ProviderTestCase2 还是 RenamingDelegatingContext?

在 SQLite 数据库中加入 3 个表

cURL 和 PHP 显示1

将一行连接到另一个表中的多行

如何在 SQL Server 中生成并手动插入唯一标识符?

如何从多个表中 Select 不同的值

如何使用 PL/SQL Developer 连接到远程 Oracle DB?

在 UI 中执行业务逻辑的单元测试数据库应用程序