创建物化视图commit_Oracle - 如何使用FAST REFRESH和JOINS创建物化视图

在Oracle中创建物化视图时,遇到加入JOIN后无法设置ON COMMIT快速刷新的问题。错误提示为ORA-12054。解决方法是确保FROM列表中的所有表的ROWID都在查询的SELECT列表中,并且物化视图日志需包含ROWID。示例代码展示了如何正确创建带有JOIN的物化视图并实现快速刷新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bd96500e110b49cbb3cd949968f18be7.png

So I'm pretty sure Oracle supports this, so I have no idea what I'm doing wrong. This code works:

CREATE MATERIALIZED VIEW MV_Test

NOLOGGING

CACHE

BUILD IMMEDIATE

REFRESH FAST ON COMMIT

AS

SELECT V.* FROM TPM_PROJECTVERSION V;

If I add in a JOIN, it breaks:

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

Now I get the error:

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

I've created materialized view logs on both TPM_PROJECT and TPM_PROJECTVERSION. TPM_PROJECT has a primary key of PROJECTID and TPM_PROJECTVERSION has a compound primary key of (PROJECTID,VERSIONID). What's the trick to this? I've been digging through Oracle manuals to no avail. Thanks!

解决方案Restrictions on Fast Refresh on Materialized Views with Joins Only

...

Rowids of all the tables in the FROM list must appear in the SELECT

list of the query.

This means that your statement will need to look something like this:

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

Another key aspect to note is that your materialized view logs must be created as with rowid.

Below is a functional test scenario:

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值