我正在尝试实施一个程序,该程序将调用运行以下代码块的Oracle作业调度程序:
create materialized view foo
parallel
nologging
never refresh
as
select * from long_running_query;
随后
drop materialized view foo;
现在我正在查看的逻辑流如下:
1)Oracle Scheduler每三十(30)分钟发射一次。
2)使用任意名称(bar)生成新的实现视图
3)bar如上所述(创建垫视图栏...)
传递到创建函数中4)视图(常规未实现的)外部删除
5)重新创建外部_view以指向步骤3中创建的实现视图
我的问题是我无法在PL/SQL或可执行文件中运行。
定期使用动态SQL的过程应起作用:
CREATE OR REPLACE PROCEDURE refresh_mv(p_mv_name VARCHAR2) AS
BEGIN
EXECUTE IMMEDIATE '
CREATE MATERIALIZED VIEW ' || dbms_assert.simple_sql_name(p_mv_name) || '
PARALLEL
NOLOGGING
NEVER REFRESH
AS
SELECT * FROM <biq_query>';
EXECUTE IMMEDIATE
'CREATE OR REPLACE VIEW outside_view AS SELECT * FROM '||p_mv_name;
-- DROP old mv?
END;
应该可以使用普通的刷新路径,如下:
create materialized view foo
parallel
nologging
refresh complete
as
select /*+ append */ * from long_running_query;
然后需要刷新时:
- 禁用Foo上的所有索引
- 刷新foo
- 重建索引,最好是通过noging。