oracle中select查询returns数据时才刷新物化视图
Materialized view to be refreshed only when the select query returns data in oracle
Create materialized view mv_testdata
BUILD IMMEDIATE
REFRESH FORCE
AS
SELECT * FROM VW_TESTDATA;
我希望视图每周刷新一次,并且仅当 vw_testdata
视图中的数据可用时。也尝试使用触发器,但没有用。
是否可以刷新视图中可用的仅 mv 数据?
如果 vw_testdata
是一个 "ordinary" 视图,它是一个存储查询并且不包含任何数据。我想您担心的是 - 如果该查询(在某个时间)获取 "nothing" 并且您刷新物化视图,您将丢失物化视图中的数据。
如果是这样,创建一个存储过程,例如
create or replace procedure p_refresh as
l_cnt number;
begin
select max(1)
into l_cnt
from vw_testdata
where exists (select null from vw_testdata);
if l_cnt = 1 then
dbms_mview.refresh('mv_testdata');
end if;
end;
/
它检查vw_testadata
中是否存在任何东西;如果是这样,它会刷新物化视图。
现在安排该程序每周执行一次。
Create materialized view mv_testdata
BUILD IMMEDIATE
REFRESH FORCE
AS
SELECT * FROM VW_TESTDATA;
我希望视图每周刷新一次,并且仅当 vw_testdata
视图中的数据可用时。也尝试使用触发器,但没有用。
是否可以刷新视图中可用的仅 mv 数据?
如果 vw_testdata
是一个 "ordinary" 视图,它是一个存储查询并且不包含任何数据。我想您担心的是 - 如果该查询(在某个时间)获取 "nothing" 并且您刷新物化视图,您将丢失物化视图中的数据。
如果是这样,创建一个存储过程,例如
create or replace procedure p_refresh as
l_cnt number;
begin
select max(1)
into l_cnt
from vw_testdata
where exists (select null from vw_testdata);
if l_cnt = 1 then
dbms_mview.refresh('mv_testdata');
end if;
end;
/
它检查vw_testadata
中是否存在任何东西;如果是这样,它会刷新物化视图。
现在安排该程序每周执行一次。