在我的机器上有一个MVIEW (MV_FACT_SALES), 直接更新肯定是不行的, 会报以下错误:
SQL> DESC MV_FACT_SALES
Name Null? Type
----------------------- -------- -------------
F_MONTH VARCHAR2(7)
M_AMOUNT1 NUMBER
M_AMOUNT2 NUMBER
SQL> INSERT INTO MV_FACT_SALES VALUES ('3000-1',1500,1600);
INSERT INTO MV_FACT_SALES VALUES ('3000-1',1500,1600)
*
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view
但可以通过Exchange Partition的方法来更新MVIEW中的数据, 实现人为地刷新, 首先检查一下现在的MVIEW的状态:
SQL> SELECT STALENESS,STALE_SINCE FROM USER_MVIEWS;
STALENESS STALE_SINCE
------------------- ------------
FRESH
接下来创建一个只有一个分区的分区表, 用于实现分区交换:
SQL> CREATE TABLE P_MV_FACT_SALES
2 (
3 F_MONTH VARCHAR2(7),
4 M_AMOUNT1 NUMBER,
5 M_AMOUNT2 NUMBER
6 )
7 PARTITION BY RANGE (F_MONTH)
8 (
9 PARTITION P_MAX VALUES LESS THAN (MAXVALUE)
10 )
11 /
Table created.
SQL> ALTER TABLE P_MV_FACT_SALES EXCHANGE PARTITION P_MAX WITH TABLE MV_FACT_SALES;
Table altered.
SQL> SELECT STALENESS,STALE_SINCE FROM USER_MVIEWS;
STALENESS STALE_SINCE
------------------- ------------
FRESH
向分区表中插入一条记录, 在实际的应用中, 要保证你的修改是对的. 然后再交换回去, 并检查MVIEW的状态.
SQL> INSERT INTO P_MV_FACT_SALES VALUES ('3000-1',1500,1600);
1 row created.
SQL> commit;
Commit complete.
SQL> ALTER TABLE P_MV_FACT_SALES EXCHANGE PARTITION P_MAX WITH TABLE MV_FACT_SALES;
Table altered.
SQL> SELECT STALENESS,STALE_SINCE FROM USER_MVIEWS;
STALENESS STALE_SINCE
------------------- ------------
FRESH
MVIEW本身提供的刷新方法是不错, 不过在数据仓库中, 它的刷新方法就不太好控制了, 因此可以用这种方法来试试.