了解物化视图刷新组间隔

时间:2019-12-19 18:00:05

标签: oracle

我正在Oracle 12c数据库中创建一个物化视图刷新组,我希望每个星期一刷新物化视图(最好在1700年之后)。在此页面上:https://docs.oracle.com/cd/B19306_01/server.102/b14227/rarrefreshpac.htm#i94210,间隔部分显示: “

Function used to calculate the next time to refresh the materialized views in the group. This field is used with the next_date value.

For example, if you specify NEXT_DAY(SYSDATE+1, "MONDAY") as your interval, and if your next_date evaluates to Monday, then Oracle refreshes the materialized views every Monday. This interval is evaluated immediately before the refresh. Thus, you should select an interval that is greater than the time it takes to perform a refresh.

因此,这意味着将今天的星期一之后的第二天作为下一个刷新日期,这将在每次刷新期间计算出来,对吗?

如果是这样,那么我相信我理解这个概念;但是,当我尝试应用与Oracle提供的完全相同的语法时,出现错误。这是我尝试过的(MV名称已修改):

BEGIN
 DBMS_REFRESH.MAKE(name => 'mv_refresh_group',
 list => 'first_mv
        , second_mv
        , third_mv
        , fourth_mv',
 next_date => sysdate,
 interval => next_day(sysdate+ 1, "MONDAY")) ;
END;

我收到一条错误消息,指出必须声明标识符“ MONDAY”。我相信这是由于使用双引号引起的,所以我将其更改为单引号,但是现在出现此错误:

ORA-23319: parameter value "23-DEC-19" is not appropriate

因此,我搜索了ORA-23319的答案,发现这是由于在interval参数中传递了一个期望字符串的日期引起的。我相信这是由sysdate + 1引起的。因此,我尝试将引号引起来,就像星期一一样,但是出现错误:

BEGIN
 DBMS_REFRESH.MAKE(name => 'mv_refresh_group',
 list => 'first_mv
        , second_mv
        , third_mv
        , fourth_mv',
 next_date => sysdate,
 interval => next_day('sysdate+ 1', 'MONDAY')) ;
END;



PLS-00103: Encountered the symbol "(sysdate+ 1" when expecting one of the following:


ORA-01858: a non-numeric character was found where a numeric was expected
ORA-06512: at line 2

我不确定如何处理这些错误。我相信我使用的是Oracle提供的确切语法,但无法正常工作。任何和所有见解将不胜感激。另外,如果任何人都可以提供有关如何在非常星期一指定时间的指导,那将是很好的;但是,最重要的是我可以理解如何解决此错误。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

这是您要寻找的:

BEGIN
 DBMS_REFRESH.MAKE(name => 'mv_refresh_group',
 list => 'first_mv
        , second_mv
        , third_mv
        , fourth_mv',
 next_date => sysdate,
 interval => 'next_day(sysdate+ 1, ''MONDAY'')') ;
END;

interval是一个包含SQL表达式的字符串参数,该表达式的计算结果为日期。由于它是一个字符串,因此必须将整个内容括在单引号中(根据所有Oracle字符串)。表达式(即“ MONDAY”)中的字符串文字必须将其单引号转义为两个单引号(即''MONDAY'',而不是"MONDAY")。