提交时创建实体化视图时出错
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
我正在尝试创建一个像这样的具体化视图:
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