如何对MVIEW进行直接的DML操作来进行刷新?

    在我的机器上有一个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本身提供的刷新方法是不错, 不过在数据仓库中, 它的刷新方法就不太好控制了, 因此可以用这种方法来试试.

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • The doctor says that I should not eat anything oily.
  • 医生说我不能吃油腻的东西.
  • I had a shot of penicillin.
  • 我打了一针青霉素.
  • You have to be operated on.
  • 你得做手术.
  • He gave me a chest X-ray and took my blood pressure.
  • 他给我做了X光胸透并量了血压.
  • Hello. May I speak to Mr. Green?
  • 你好, 我找格林先生.