物化视图数据不会更新

时间:2015-07-22 07:34:06

标签: oracle oracle10g oracle-xe

我想创建一个快速刷新的物化视图。视图聚合来自单个表的值:

$("#readBtn").submit(function(e){
    e.preventDefault();
});

我是通过反复试验来写的:

CREATE TABLE N_INSP_DTSEDIF_PLANTAS (
    IMPORTACION_ID NUMBER(*,0) NOT NULL,
    ID NUMBER(10) NOT NULL,
    INSPECCION_ID NUMBER(10) NOT NULL,
    NOMBRE_PLANTA VARCHAR2(255 CHAR),
    NUM_VIVIENDAS NUMBER(10),
    SUP_CONSTRUIDA_VIVIENDAS DECIMAL(10,4),
    -- Plus some other columns I don't need    
    CONSTRAINT N_INSP_DTSEDIF_PLANTAS_P PRIMARY KEY (
        IMPORTACION_ID,
        ID
    ) ENABLE,

    CONSTRAINT N_INSP_DTSEDIF_PLANTAS_F FOREIGN KEY (IMPORTACION_ID)
        REFERENCES IMPORTACION (IMPORTACION_ID)
        ON DELETE CASCADE
        ENABLE
);

CREATE INDEX N_INSP_DTSEDIF_PLANTAS_X ON N_INSP_DTSEDIF_PLANTAS (IMPORTACION_ID);

CREATE SEQUENCE N_INSP_DTSEDIF_PLANTAS_S
INCREMENT BY 1
START WITH 1
MINVALUE 1
CACHE 20;

CREATE OR REPLACE TRIGGER N_INSP_DTSEDIF_PLANTAS_T
    BEFORE INSERT
    ON N_INSP_DTSEDIF_PLANTAS
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
BEGIN
    IF :NEW.ID IS NULL THEN
        SELECT N_INSP_DTSEDIF_PLANTAS_S.NEXTVAL INTO :NEW.ID FROM DUAL;
    END IF;
END N_INSP_DTSEDIF_PLANTAS_T;
/
ALTER TRIGGER N_INSP_DTSEDIF_PLANTAS_T ENABLE;

创建对象时没有错误,CREATE MATERIALIZED VIEW LOG ON N_INSP_DTSEDIF_PLANTAS WITH ROWID, SEQUENCE (IMPORTACION_ID, INSPECCION_ID, NUM_VIVIENDAS, SUP_CONSTRUIDA_VIVIENDAS) INCLUDING NEW VALUES; CREATE MATERIALIZED VIEW V_PLANTAS REFRESH FAST AS SELECT IMPORTACION_ID, INSPECCION_ID, SUM(NUM_VIVIENDAS) AS NUM_VIVIENDAS, SUM(SUP_CONSTRUIDA_VIVIENDAS) AS SUP_CONSTRUIDA_VIVIENDAS FROM N_INSP_DTSEDIF_PLANTAS GROUP BY IMPORTACION_ID, INSPECCION_ID; 返回数据。然而,观点停滞不前。添加到SELECT * FROM V_PLANTAS的新行未显示在N_INSP_DTSEDIF_PLANTAS

我从文档中误解了什么?

1 个答案:

答案 0 :(得分:1)

随着恐慌和绝望的随机变化,我无意中放弃了ON COMMIT条款:

CREATE MATERIALIZED VIEW V_PLANTAS
REFRESH FAST ON COMMIT
AS
-- ...

对于快速刷新,日志本身也无效,因为我也省略了PRIMARY KEY子句。应该是这样的:

CREATE MATERIALIZED VIEW LOG ON N_INSP_DTSEDIF_PLANTAS
WITH ROWID, PRIMARY KEY, SEQUENCE (INSPECCION_ID, NUM_VIVIENDAS, SUP_CONSTRUIDA_VIVIENDAS)
INCLUDING NEW VALUES;

(说,值得注意的是,物化表不仅仅是一个简单的结果缓存,而是一个相当大而复杂的功能,需要仔细规划和维护。在许多情况下更容易优化基础查询。)