【问题标题】:Mview Refresh error while doing Force refresh执行强制刷新时 Mview 刷新错误
【发布时间】:2021-10-10 05:16:30
【问题描述】:

我们有 4 个使用强制刷新方法的 Mview,在将新数据加载到基表(在基表上创建的 Mview 日志)后,使用我们的 control-M 作业每天刷新。 在我们当前的生产数据库 (11g) 中,非生产环境运行良好,刷新这些视图时出现这些问题。 现在我们将我们的数据库迁移到 oracle 12c,作为迁移的一部分,我们将所有对象从当前 11g 导入到新的 12c 数据库。

所以现在当我们运行我们的 control-M 作业以在基表中加载新数据并在之后强制刷新这些 mview 时,它们因 ORA-12008 失败:物化视图刷新路径中的错误 ORA-00923: 在预期的地方找不到 FROM 关键字

我尝试运行 Mview 中使用的查询,它们工作正常(在新的 12c DB 上),但没有给出任何错误并重新创建它们,但同样的错误仍然存​​在,将 CTAS 与 MVIEW 选择查询一起使用,并且创建的表没有错误,其中的数据。

以下是支持其中一个 Mview 的 DDL --

CREATE MATERIALIZED VIEW HEW.MV_EUC_MVT_ADM_MULTI 
    (NUMCOM,ACCOUNT,BANK_CODE,PRODUCT,CUST_TYPE,
     SOURCE,CI,DEVISE,"DATE TRT",DATE_CBL,
     ORIGINE,MONTANT,MONTANT_CVEUR,SENS,ENTITE,
     AFFILIATE,BOOK_CODE,BU,MAFF,J_SOURCE,
     PM)
NOCACHE
LOGGING
NOCOMPRESS
BUILD IMMEDIATE
REFRESH FORCE ON DEMAND
WITH PRIMARY KEY
AS 
/* Formatted on 7/5/2021 1:03:02 PM (QP5 v5.277) */
SELECT    SUBSTR ('00000000000' || MVT.ACCOUNT,
                  LENGTH ('00000000000' || MVT.ACCOUNT) - 10,
                  11)
       || SUBSTR ('000000' || MVT.PRODUCT,
                  LENGTH ('000000' || MVT.PRODUCT) - 5,
                  6)
       || SUBSTR ('0000000000' || MVT.CHARTFIELD2,
                  LENGTH ('0000000000' || MVT.CHARTFIELD2) - 9,
                  10)
       || SUBSTR ('0000000000' || MVT.CHARTFIELD1,
                  LENGTH ('0000000000' || MVT.CHARTFIELD1) - 9,
                  10)
          AS NUMCOM,
       MVT.ACCOUNT,
       MVT.BANK_CODE AS BANK_CODE,
       NVL (MVT.PRODUCT, '0') AS PRODUCT,
       NVL (MVT.CHARTFIELD2, '0') AS CUST_TYPE,
       NVL (MVT.CHARTFIELD1, '0') AS SOURCE,
       SUBSTR (MVT.DEPTID, 6, 5) AS CI,
       MVT.FOREIGN_CURRENCY AS DEVISE              --,MVT.Z_DT_TRT AS DATE_TRT
                                     ,
       MVT.DATE_SITU AS "DATE TRT",
       MVT.JOURNAL_DATE AS DATE_CBL,
       MVT.Z_CD_ORIGINE AS ORIGINE,
       MVT.FOREIGN_AMOUNT AS MONTANT,
       MVT.MONETARY_AMOUNT AS MONTANT_CVEUR,
       DECODE (SIGN (MVT.FOREIGN_AMOUNT), 1, 'C', 'D') AS SENS,
       SUBSTR (MVT.DEPTID, 8, 3) AS ENTITE,
       NVL (MVT.AFFILIATE, '00000') AS AFFILIATE,
       MVT.BOOK_CODE AS BOOK_CODE,
       MVT.BUSINESS_UNIT_GL AS BU,
          MVT.FISCAL_YEAR
       || TO_CHAR (TO_DATE (MVT.ACCOUNTING_PERIOD, 'MM'), 'MM')
          AS MAFF,
       MVT.SOURCE AS J_SOURCE,
       DBMS_MVIEW.pmarker (mvt.ROWID) AS pm
  FROM CRAFT_MVT_MULTI_H MVT, CRAFT_PARAM_DATE DT
 WHERE     (   (    MVT.FISCAL_YEAR = DT.fiscyear_lastday_mon_1
                AND ACCOUNTING_PERIOD = DT.accper_lastday_mon_1)
            OR (    MVT.FISCAL_YEAR = DT.fiscyear_yesterday
                AND ACCOUNTING_PERIOD = DT.accper_yesterday))
       AND (   (    (MVT.ACCOUNT LIKE '4%' OR MVT.ACCOUNT LIKE '5%')
                AND MVT.FOREIGN_CURRENCY <> 'EUR'
                AND (MVT.Z_CD_ORIGINE <> '716' OR MVT.Z_CD_ORIGINE IS NULL))
            OR (MVT.ACCOUNT = '4083513001' AND MVT.FOREIGN_CURRENCY = 'EUR')
            OR (MVT.ACCOUNT = '2059630001'))
       AND MVT.DATE_SITU > DT.lastday_month_2;

CREATE MATERIALIZED VIEW LOG ON HEW.CRAFT_MVT_MULTI_H
NOCACHE
LOGGING
WITH ROWID
EXCLUDING NEW VALUES;

CREATE MATERIALIZED VIEW LOG ON HEW.CRAFT_PARAM_DATE
NOCACHE
LOGGING
WITH ROWID
EXCLUDING NEW VALUES;

错误--

ORA-12008: error in materialized view refresh path

ORA-00923: FROM keyword not found where expected
Detailed Error Message :

ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2821

ORA-06512: at "SYS.DBMS_SNAPSHOT", line 3058

ORA-06512: at "SYS.DBMS_SNAPSHOT", line 3017

请注意,在我们当前的 11g DB 上,此 Mview 每天都会强制刷新而不会出现错误。 还有一件事我注意到,在迁移之后我们运行了一个 DROP,为所有 Mviews 和所有其他东西创建脚本,然后当我对这些 Mview 进行强制刷新时,它们会被刷新,但是第二天当我们加载时基表中的新数据并刷新这些 mview,然后它们才开始抛出错误,所以在这里我假设当我们在基表中插入数据时它会出错!

新的 12c DB 版本 --

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

当前工作的 11g DB 版本 --

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

请让我知道您需要更多信息,我会尽力安排。

【问题讨论】:

    标签: oracle oracle12c materialized-views


    【解决方案1】:

    Oracle 不使用 MVIEW 定义中的查询来执行刷新。它使用自己的内部规则动态构建刷新查询,以利用 MVIEW 日志和其他数据库功能。构造的刷新查询中存在语法错误,由 ORA-00923 错误指示:这就是您最初能够创建 MVIEW 但刷新失败的原因。

    这不是您可以直接更正的。 Master Note for MVIEW 'ORA-' error diagnosis. For Materialized View CREATE or REFRESH 中给出的推荐行动方案是向 Oracle 支持提出服务请求。

    【讨论】:

    • 感谢您的回复 pmdba,我们的 DBA 团队已经在与 Oracle 支持进行对话,因此我想在这里询问是否有人对我面临的问题有任何看法。只是想知道你能否指出你所指的错误构造刷新查询语法错误它帮助我理解
    • 就像我在问题中提到的这些 MVIEWS 并且在我们当前的所有数据库中运行良好,我们在迁移到 12c 时得到了一段时间
    猜你喜欢
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多