如何使用触发器刷新物化视图?

man*_*ada 1 sql oracle triggers materialized-views oracle10g

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;
Run Code Online (Sandbox Code Playgroud)

这是我用来刷新Materialized View的sql触发器.但它说......

Warning: execution completed with warning
TRIGGER REFRESH_REST_VIEW Compiled.
Run Code Online (Sandbox Code Playgroud)

PS:当表的数据(由Materialized View使用)进行任何DML操作时,将执行触发器.

我已经google了足够多,很多帖子说这是可能的,但我没有得到如何做到这一点.我尝试使用常规触发器语法,但它不起作用.

更新:

现在我尝试与过程和触发器相同..

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;
Run Code Online (Sandbox Code Playgroud)

所有都已成功编译,但在表中更新时它说:

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'
Run Code Online (Sandbox Code Playgroud)

Jus*_*ave 7

刷新触发器中的物化视图没有意义.

您可以通过删除单词来解决语法错误 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;
Run Code Online (Sandbox Code Playgroud)

这将导致触发器编译.但是,当您尝试执行INSERTUPDATE反对时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'
Run Code Online (Sandbox Code Playgroud)

您可能会尝试通过吹走事务完整性并在自治事务中执行刷新来解决此问题.这将消除ORA-04092错误,但是物化视图将不会有作为首先触发触发器的事务的一部分插入或更新的未提交数据,这会破坏刷新物化视图的整个目的.

正确的方法是首先不要使用触发器.正确的方法是定义物化视图以在commit--上刷新自己REFRESH FAST ON COMMIT.由于您收到的错误是无法ON COMMIT在物化视图中设置属性,因此您需要查看"数据仓库指南"中列出的快速刷新限制,并确保物化视图应该可以快速刷新.然后,您可以使用dbms_mview.explain_mview过程告诉您为什么实体化视图不能在提交时以增量方式刷新.