Oracle物化視圖獲取增量數據

物化視圖的快速刷新需要先構造物化視圖日誌,而物化視圖日誌中會記錄表的dml操作,因此可以通過物化視圖日誌訂閱Oracle增量。

1.物化視圖日誌名

物化視圖日誌名爲MLOG$_表名。當表名長度超過20時,只取前20位;當出現截短後名稱重複時,會自動在物化視圖日誌名後面添加數字。

2.物化視圖日誌結構

基本字段:
SNAPTIME$$:數據刷新的時間;當該物化視圖日誌僅供一張物化視圖使用時,爲4000-01-01 00:00:00;當其供多張物化視圖使用時,該字段會記錄dml操作的時間。

DMLTYPE$$: 表示DML操作類型,I表示INSERTD表示DELETEU表示UPDATE

OLD_NEW$$:表示這個值是新值還是舊值。N表示新值,O表示舊值,U表示UPDATE操作。

CHANGE_VECTOR$$:表示修改矢量,用來表示被修改的是哪個或哪幾個字段。

特殊字段:

(1)構建物化視圖日誌時添加了rowid,因此物化視圖日誌中會包含字段:M_ROW$$:存儲增量記錄的ROWID。

 

create materialized view log on student with rowid including new values;


(2)構建物化視圖日誌時添加了primary key,因此物化視圖日誌中會包含主鍵字段

create materialized view log on student with primary key including new values;


(3)構建物化視圖日誌時添加了SEQUENCE,因此物化視圖日誌中會包含字段:SEQUENCE$$:每個操作的SEQUENCE號,從而保證刷新時按照順序進行刷新。

CREATE MATERIALIZED VIEW LOG ON STUDENT WITH 
sequence ( C_ID, C_NAME ) including new VALUES;


(4)構建物化視圖日誌時添加了表的字段名,因此物化視圖日誌中會包含這些字段

CREATE MATERIALIZED VIEW LOG ON STUDENT WITH 
 C_ID, C_NAME  including new VALUES;


3.注意點

(1)基於主鍵的物化視圖日誌,如果更新主鍵時,DML操作會轉爲一條DELETE記錄和一條INSERT記錄。即更新主鍵操作被轉換爲先插入新記錄,然後刪除舊記錄;
(2)當創建物化視圖日誌時包含INCLUDING NEW VALUES語句時,每條UPDATE操作會在物化視圖日誌中生成兩條記錄。一條對應UPDATE操作的原記錄DMLTYPE$$和OLD_NEW$$都爲U;一條對應UPDATE操作後的新記錄,DMLTYPE$$爲U,OLD_NEW$$爲N;

4.通過Oracle物化視圖日誌實現Oracle增量抽取。

目標表結構:

CREATE TABLE STUDENT(
  C_ID NUMBER PRIMARY KEY,
  C_NAME VARCHAR(255) 
)


1)實現該功能所需SQL語句:
(1.1) 創建物化視圖日誌

CREATE MATERIALIZED VIEW LOG ON STUDENT WITH ROWID,
sequence ( C_ID, C_NAME ) including new VALUES;

(1.2) 獲取增量記錄

SELECT  *

FROM MLOG$_STUDENT

ORDER BY SEQUENCE$$;
(1.3) 提交增量數據後,刪除已經提交的增量數據

 DELETE FROM MLOG$_STUDENT WHERE SEQUENCE$$ > lastID
(1.4) 增量完成後,刪除物化視圖日誌

DROP MATERIALIZED VIEW LOG ON STUDENT;
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章