提交时创建实体化视图时出错

Error creating materialized view ON COMMIT

我正在尝试创建一个像这样的具体化视图:

CREATE MATERIALIZED VIEW MVProductStock 
BUILD IMMEDIATE
REFRESH FAST
ON COMMIT
AS
SELECT 
    IMP.PRODUCTID ID, 
    IMP.TOSTOCKID STOREID, 
    (IMP.TOTAL-COALESCE(EXP.TOTAL,0)) QUANTITY,
    SP.NAME,
    SP.COLOR,
    SP.WIDTH,
    SP.HEIGHT,
    SP.WEIGHT,
    SP.TYPE,
    SP.CATEGORY,
    SP.INTERNALREFERENCE,
    SP.EAN13BARCODE,
    SP.SALEPRICE,
    SP.WHOLESALEPRICE,
    SP.COSTPRICE,
    SP.COSTOUTSOURCE,
    SP.SALEBONUS,
    SP.MANUFACTUREBONUS,
    SP.UOM,
    SP.UOMPURCHASE,
    SP.PROCUREMENTMETHOD,
    SP.SUPPLYMETHOD,
    SP.MFACTLEADTIME,
    SP.STATUS,
    SP.PHOTO,
    SP.DESCRIPTION,
    SP.PARENTID,
    SP.TAXVATIN,
    SP.TAXVATOUT,
    SP.DEBIT,
    SP.CREDIT
FROM 
    (SELECT P1.PRODUCTID,
            SUM(P1.quantity) TOTAL,
            S1.TOSTOCKID
    FROM STOCKTRANSFERPRODUCT P1
    INNER JOIN STOCKTRANSFER S1 ON S1.ID = P1.STOCKTRANSFER
    GROUP BY P1.PRODUCTID, S1.TOSTOCKID) IMP
LEFT JOIN
    (SELECT P1.PRODUCTID,
            SUM(P1.quantity) TOTAL,
            S1.FROMSTOCKID
    FROM STOCKTRANSFERPRODUCT P1
    INNER JOIN STOCKTRANSFER S1
    ON S1.ID = P1.STOCKTRANSFER
    GROUP BY P1.PRODUCTID,S1.FROMSTOCKID) EXP 
ON IMP.TOSTOCKID = EXP.FROMSTOCKID AND IMP.PRODUCTID = EXP.PRODUCTID  
INNER JOIN PRODUCT SP ON SP.ID = IMP.PRODUCTID 
ORDER BY IMP.TOSTOCKID;

下面的table:

Table STOCKTRANSFER 
    ID  VARCHAR2(50 BYTE)
    TYPEID  NUMBER(10,0)
    STATUS  NUMBER(10,0)
    POSTDATE    DATE
    DUEDATE DATE
    NOTE    VARCHAR2(300 BYTE)
    SALEORDERID VARCHAR2(50 BYTE)
    PURCHASEORDERID VARCHAR2(50 BYTE)
    MANUFACTUREORDERID  VARCHAR2(50 BYTE)
    PARTNERID   VARCHAR2(20 BYTE)
    FROMSTOCKID VARCHAR2(20 BYTE)
    TOSTOCKID   VARCHAR2(20 BYTE)
    USERCREATED VARCHAR2(50 BYTE)
    DATECREATED TIMESTAMP(0)
    USERUPDATED VARCHAR2(50 BYTE)
    DATEUPDATED TIMESTAMP(0)
    COMPANYID   NUMBER(10,0)[/code]

 Table STOCKTRANSFERPRODUCT 
    ID  VARCHAR2(50 BYTE)
    STOCKTRANSFER   VARCHAR2(50 BYTE)
    PRODUCTID   VARCHAR2(20 BYTE)
    QUANTITY    NUMBER(38,2)

错误内容:

Error at Command Line : 55 Column : 34
Error report -
SQL Error: ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view
12054. 00000 -  "cannot set the ON COMMIT refresh attribute for the materialized view"
*Cause: The materialized view did not satisfy conditions for refresh at
           commit time.
*Action:   Specify only valid options.

请告诉我如何修复此错误,以及执行我的 MATERIALIZED VIEW 的最佳方法,因为数据每秒都在更改。要快速刷新,我该如何创建 MATERIALIZED VIEW LOG。

我刚接触oracle,请帮助我。 非常感谢。

快速刷新可能非常难以启用。有 many restrictions 个关于快速刷新的,但并不是所有的都被很好地记录下来。

如果一个简单的查询需要完全重写以启用快速刷新,请不要感到惊讶。对于此示例,FROM 列表中所有表的 Rowid 必须出现在查询的 SELECT 列表中。

在那之后它可能仍然无法工作,您需要使用 DBMS_MVIEW.EXPLAIN_MVIEW 来查看有关为什么未启用快速刷新的更多信息

要创建的 Oracle 文档 MATERIALIZED VIEW LOG