查找物化視圖日志(Materialized view log)
需求:查找物化視圖日志中的數據。背景:兩個數據庫,為了同步。在其中一個數據庫的表上建物化視圖日志,當表的數據有更新,對應的物化視圖日志就會有相應記錄。詳細的創建、查詢物化視圖日志的介紹見下文附錄。
ps: 下文開始,物化視圖日志用mvlog 代替。
首先聲明不知道還沒有別的辦法,自己想到就是這個土辦法。
1 查找到所有mvlog ;
2 找到所有涉及到的表的主鍵列;
3 查詢每個mvlog中的主鍵的值。
1 查詢所有的mvlog,找到表名和mvlog表名
1 SELECT MASTER, LOG_TABLE FROM DBA_MVIEW_LOGS WHERE LOG_OWNER = UPPER(?)
注:這里的參數和2的OWNER的參數值是一樣的,都是數據庫用戶名(登錄用的)。2 用1查詢到的每個表名去查詢那個表的主鍵列。
1 " SELECT T2.COLUMN_NAME "
2 + " FROM DBA_CONSTRAINTS T1, DBA_IND_COLUMNS T2 "
3 + " WHERE T1.TABLE_NAME =UPPER(?) "
4 + " AND T2.TABLE_NAME=T1.TABLE_NAME "
5 + " AND T1.CONSTRAINT_TYPE='P' "
6 + " AND T1.INDEX_NAME = T2.INDEX_NAME "
7 + " AND T1.OWNER=UPPER(?) ";
注:參數1就是1查詢到的“MASTER”的值。2 + " FROM DBA_CONSTRAINTS T1, DBA_IND_COLUMNS T2 "
3 + " WHERE T1.TABLE_NAME =UPPER(?) "
4 + " AND T2.TABLE_NAME=T1.TABLE_NAME "
5 + " AND T1.CONSTRAINT_TYPE='P' "
6 + " AND T1.INDEX_NAME = T2.INDEX_NAME "
7 + " AND T1.OWNER=UPPER(?) ";
3 用1查詢到的每個mvlog表去查詢2查詢到的每個主鍵列的值
1 " SELECT DISTINCT "
2 while () {
3 @2@COLUMN_NAME + ","
4 }
5 " FROM @1@LOG_TABLE "
2 while () {
3 @2@COLUMN_NAME + ","
4 }
5 " FROM @1@LOG_TABLE "
這樣就得到了,每個mvlog中的主鍵的值。
附錄:1創建mvlog
1 create materialized view log on marea with primary key,rowid,
sequence (AREA_NM_R, AREA_NM_N) including new values;
primary key是主鍵,rowid是表更新涉及的行號,sequence是序列對,自由添加。sequence (AREA_NM_R, AREA_NM_N) including new values;
2查詢mvlog
查詢mvlog和查詢表是一樣的,簡單的查詢語句就可以。
1 select * from mlog$_marea
關于mvlog 的介紹目前只接觸到這些,To be continued...
文中涉及到的DBA_MVIEW_LOGS,DBA_CONSTRAINTS,DBA_IND_COLUMNS 也有必要介紹下,不過看字面意思還是能望而生義的...
------------------------------我是分割線----------------------------------
因為對DBA表不甚了解,項目開發的時候果然出了點問題。
客戶后來要求不要用DBA的表,改用USER表。因為考慮到商用環境,用戶一般不會給予DBA權限。
所以兩段SQL文稍有修改:
1 查詢所有的mvlog,找到表名和mvlog表名
1
SELECT MASTER, LOG_TABLE FROM USER_MVIEW_LOGS
2 用1查詢到的每個表名去查詢那個表的主鍵列。
1
"
SELECT T2.COLUMN_NAME
"
2 + " FROM USER_CONSTRAINTS T1, USER_IND_COLUMNS T2 "
3 + " WHERE T1.TABLE_NAME =UPPER(?) "
4 + " AND T2.TABLE_NAME=T1.TABLE_NAME "
5 + " AND T1.CONSTRAINT_TYPE='P' "
6 + " AND T1.INDEX_NAME = T2.INDEX_NAME " ;
2 + " FROM USER_CONSTRAINTS T1, USER_IND_COLUMNS T2 "
3 + " WHERE T1.TABLE_NAME =UPPER(?) "
4 + " AND T2.TABLE_NAME=T1.TABLE_NAME "
5 + " AND T1.CONSTRAINT_TYPE='P' "
6 + " AND T1.INDEX_NAME = T2.INDEX_NAME " ;
注:主要就是將DBA表->USER表,并把OWNER和LOG_OWNER的限制去掉了,因為USER表對應的肯定是用戶本身,也就沒有必要限制了。
posted on 2009-06-15 17:24 游雯 閱讀(10330) 評論(0) 編輯 收藏 所屬分類: Java編程技巧