0

次のコードブロックを実行するOracleジョブスケジューラを呼び出すプログラムを実装しようとしています。

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

その後

drop materialized view foo;

今私が見ている論理フローは次のとおりです。

1)OracleSchedulerは30分ごとに起動します。
2)新しいマテリアライズドビューが任意の名前(bar)で生成されます
3)バーが上記のようにcreate関数に渡されます(マットビューバーを作成します...)
4)ビュー(通常のマテリアライズドではありません)outside_viewが削除されます
5)outside_viewが再作成されます手順3で作成されたマテリアライズドビューをポイントします

私の問題は、これをPL/SQL内または実行可能ファイルとして実行することができなかったことです。

4

2 に答える 2

1

動的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;
于 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 に答える