--创建物化视图
1.首先在源表用户下面建立基于物化视图的日志,用于记录刷新记录。
create MATERIALIZED VIEW LOG ON FDDEF11
WITH PRIMARY KEY
INCLUDING NEW VALUES;
2.建立dblink
3.建立FAST 物化视图,只能采用子查询模式,且查询条件中必须是主键
CREATE MATERIALIZED VIEW SPXX_FD123
REFRESH FAST ON DEMAND
START WITH TO_DATE('16-05-2014 07:32:30', 'DD-MM-YYYY HH24:MI:SS') NEXT SYSDATE + (1/(24*60))
AS
SELECT A.* FROM CSUSER.SPXX_FD@ZDTOPOS A
where exists (select 1 from FDDEF11@ZDTOPOS B WHERE A.FDBH=B.FDBH AND POSID=1)
create index INX_JGDDEF_FDBH on JGDDEF (FDBH);
--
物化视图日志
物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当截短后出现名称重复时,Oracle会自动在物化视图日志名称后面加上数字作为序号。
物化视图日志在建立时有多种选项:可以指定为ROWID、PRIMARY KEY和OBJECT ID几种类型,同时还可以指定SEQUENCE或明确指定列名。
上面这些情况产生的物化视图日志的结构都不相同。
任何物化视图都会包括的4列:
SNAPTIME$$:用于表示刷新时间。
DMLTYPE$$:用于表示DML操作类型,I表示INSERT,D表示DELETE,U表示UPDATE。
OLD_NEW$$:用于表示这个值是新值还是旧值。N(EW)表示新值,O(LD)表示旧值,U表示UPDATE操作。
CHANGE_VECTOR$$:表示修改矢量,用来表示被修改的是哪个或哪几个字段。
如果WITH后面跟了ROWID,则物化视图日志中会包含:M_ROW$$:用来存储发生变化的记录的ROWID。
如果WITH后面跟了PRIMARY KEY,则物化视图日志中会包含主键列。
如果WITH后面跟了OBJECT ID,则物化视图日志中会包含:SYS_NC_OID$:用来记录每个变化对象的对象ID。
如果WITH后面跟了SEQUENCE,则物化视图日子中会包含:SEQUENCE$$:给每个操作一个SEQUENCE号,从而保证刷新时按照顺序进行刷新。
如果WITH后面跟了一个或多个COLUMN名称,则物化视图日志中会包含这些列。
4.在目标数据库,防止物化视图本身刷新机制出问题,重新建立job刷新
/***********在目标数据库,防止物化视图本身刷新机制出问题,重新建立job刷新*****/
create or replace procedure CSPUB.refresh_BFCONFIG Is
v_msg Varchar2(500);
--v_num Varchar2(14);
begin
--防止视图失败,重新编译物化视图
execute immediate 'alter materialized view BFCONFIG compile';
--增量刷新物化视图
begin
dbms_mview.refresh('BFCONFIG');
Exception
When Others Then
v_msg := Sqlerrm;
end;
Commit;
end refresh_BFCONFIG;
/
/**********制作刷新该过程的语句********************************/
DECLARE 100 NUMBER ;
begin
dbms_job.isubmit(100,'refresh_BFCONFIG;',SYSDATE,'SYSDATE+30/1440');
END;
/
5.刷新物化视图 --命令行
EXEC dbms_mview.refresh('SPXX_FD','F'); ---快速刷新
BEGIN
dbms_mview.refresh('SPXX_FD','C'); ---全部刷新
END;