如果您想在插入 MV 时查看每一行,简短的回答是:
你不能。
materialized view 存储查询的结果,因为它存在现在,而不是过去某个时间。因此,在更新一行后,您可以查看其当前值或将其从 MV 中排除。
如果您想在插入时保留/查看数据状态,您有几个选择:
哪一个最合适取决于您为什么需要在插入时查看数据。
从技术上讲,可以在插入时查看数据 - 直到某个点。
使用闪回版本查询,您可以查看表随时间的变化。所以你可以这样做:
create table t (
c1 int, c2 int,
insert_date timestamp,
update_date timestamp
);
exec dbms_session.sleep(10);
insert into t values ( 1, 1, systimestamp, systimestamp );
insert into t values ( 2, 2, systimestamp, systimestamp );
commit;
create materialized view mv
as
select t.*
from t
versions between scn minvalue
and maxvalue
where versions_operation = 'I';
exec dbms_session.sleep(10);
update t
set c2 = 9999,
update_date = systimestamp
where c1 = 2;
insert into t values ( 3, 3, systimestamp, systimestamp );
commit;
exec dbms_mview.refresh ( 'mv' );
select * from t;
C1 C2 INSERT_DATE UPDATE_DATE
1 1 26-JUL-2021 13.49.51.666954000 26-JUL-2021 13.49.51.666954000
2 9999 26-JUL-2021 13.49.51.712259000 26-JUL-2021 13.50.08.421872000
3 3 26-JUL-2021 13.50.08.462300000 26-JUL-2021 13.50.08.462300000
select *
from mv;
C1 C2 INSERT_DATE UPDATE_DATE
3 3 26-JUL-2021 13.50.08.462300000 26-JUL-2021 13.50.08.462300000
2 2 26-JUL-2021 13.49.51.712259000 26-JUL-2021 13.49.51.712259000
1 1 26-JUL-2021 13.49.51.666954000 26-JUL-2021 13.49.51.666954000
这使用撤消来重建历史。最终,较旧的更改将消失,您将回到只看到当前状态。默认情况下,您只能获得 15 分钟 的更改!
如果您想长期存储历史记录,闪回数据存档是您的最佳选择。