0

我正在尝试实现一个程序,该程序将调用运行以下代码块的 Oracle 作业调度程序:

create materialized view foo  
parallel  
nologging  
never refresh  
as  
select * from long_running_query;

随后

drop materialized view foo;

现在我正在查看的逻辑流程如下:

1) Oracle 调度程序每三十 (30) 分钟触发一次。
2) 以任意名称生成新的物化视图 (bar)
3) 将 Bar 传递给上述创建函数(创建 mat 视图 bar...)
4) 视图(常规未物化) outside_view 被删除
5) outside_view 被重新创建指向在步骤 3 中创建的物化视图

我的问题是我无法让它在 PL/SQL 中运行或作为可执行文件运行。

4

2 回答 2

1

A procedure with regular use of dynamic SQL should work:

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;
于 2012-10-22T15:06:18.673 回答
0

应该可以使用如下的普通刷新路径:

create materialized view foo
parallel
nologging
refresh complete
as  
select /*+ append */ * from long_running_query;

然后在需要刷新的时候:

  1. 禁用 foo 上的所有索引
  2. 刷新 foo
  3. 重建索引,最好不要记录。
于 2012-10-22T15:17:59.650 回答