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;

这将导致触发器编译。但是,当您尝试执行 anINSERT或 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 错误,但随后物化视图将不会包含作为首先触发触发器的事务的一部分插入或更新的未提交数据,这违背了刷新物化视图的整个目的。

正确的方法是首先不使用触发器。正确的方法是定义物化视图以在提交时刷新自身-- REFRESH FAST ON COMMIT。由于您收到无法ON 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 回答