3
create or replace TRIGGER REFRESH_REST_VIEW
 AFTER
  INSERT OR UPDATE
 ON tbl_contract
BEGIN
    execute DBMS_MVIEW.REFRESH('REST_VIEW');
END REFRESH_REST_VIEW;
commit;

これは、マテリアライズドビューを更新するために使用しているSQLトリガーです。しかし、それは言います。

Warning: execution completed with warning
TRIGGER REFRESH_REST_VIEW Compiled.

PS:トリガーは、テーブルのデータ(マテリアライズド・ビューで使用)がDML操作を実行したときに実行されます。

私は十分にグーグルで検索しました、多くの投稿はそれが可能であると言います、しかし私はそれをする方法を得ていません。通常のトリガー構文で試しましたが、機能しません。

更新しました:

今、私はプロシージャとトリガーで同じことをしようとしています。

create or replace
PROCEDURE Rfresh_mate_views AS
  BEGIN
   DBMS_MVIEW.REFRESH('REST_VIEW');
  END Rfresh_mate_views;


create or replace trigger refresh_company_mview
after insert or update ON BCD.BCD_COMPANY
begin
RFRESH_MATE_VIEWS(); 
end refresh_company_mview;

すべてが正常にコンパイルされましたが、テーブルを更新している間、次のように表示されます。

ORA-04092: cannot COMMIT in a trigger
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2449
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2429
ORA-06512: at "BCD.RFRESH_MATE_VIEWS", line 3
ORA-06512: at "BCD.REFRESH_COMPANY_MVIEW", line 2
ORA-04088: error during execution of trigger 'BCD.REFRESH_COMPANY_MVIEW'
4

2 に答える 2

14

トリガーでマテリアライズド ビューを更新しても意味がありません。

単語を削除することで構文エラーを解決できますEXECUTE

create or replace TRIGGER REFRESH_REST_VIEW
 AFTER
  INSERT OR UPDATE
 ON tbl_contract
BEGIN
    DBMS_MVIEW.REFRESH('REST_VIEW');
END REFRESH_REST_VIEW;

これにより、トリガーがコンパイルされます。INSERTただし、 anまたは an UPDATEagainstを実行しようとするtbl_contractと、マテリアライズド ビューの更新を行うと暗黙的なコミットが行われ、トリガー内でコミットできないため、トリガーでのコミットが許可されていないという実行時エラーが発生します。

SQL> create table foo( col1 number );

Table created.

SQL> create materialized view mv_foo
  2  as
  3  select *
  4    from foo;

Materialized view created.

SQL> create trigger trg_foo
  2    after insert or update on foo
  3  begin
  4    dbms_mview.refresh( 'MV_FOO' );
  5  end;
  6  /

Trigger created.

SQL> insert into foo values( 1 );
insert into foo values( 1 )
            *
ERROR at line 1:
ORA-04092: cannot COMMIT in a trigger
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2760
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2740
ORA-06512: at "SCOTT.TRG_FOO", line 2
ORA-04088: error during execution of trigger 'SCOTT.TRG_FOO'

トランザクションの整合性を吹き飛ばし、自律型トランザクションで更新を行うことで、それを解決しようとする可能性があります。これにより ORA-04092 エラーは解消されますが、マテリアライズド ビューには、最初にトリガーを起動したトランザクションの一部として挿入または更新されたコミットされていないデータが含まれず、マテリアライズド ビューを更新するという目的全体が無効になります。

適切なアプローチは、そもそもトリガーを使用しないことです。適切なアプローチは、具体化されたビューを定義して commit-- でそれ自体を更新することですREFRESH FAST ON COMMITON COMMITマテリアライズド ビューに属性を設定できないというエラーが表示されるため、データ ウェアハウス ガイドに記載されている高速更新の制限を確認し、マテリアライズド ビューが高速更新可能であることを確認してください。次に、dbms_mview.explain_mview プロシージャを使用して、マテリアライズド ビューがコミット時にインクリメンタル リフレッシュに適していない理由を確認できます。

于 2012-10-25T14:03:41.867 に答える
0

その他のオプションについては、以下のリンクを参照してください

http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:352126355153

于 2013-04-01T09:25:38.713 に答える