查找物化視圖日志(Materialized view log)
需求:查找物化視圖日志中的數(shù)據(jù)。背景:兩個(gè)數(shù)據(jù)庫(kù),為了同步。在其中一個(gè)數(shù)據(jù)庫(kù)的表上建物化視圖日志,當(dāng)表的數(shù)據(jù)有更新,對(duì)應(yīng)的物化視圖日志就會(huì)有相應(yīng)記錄。詳細(xì)的創(chuàng)建、查詢物化視圖日志的介紹見(jiàn)下文附錄。
ps: 下文開(kāi)始,物化視圖日志用mvlog 代替。
首先聲明不知道還沒(méi)有別的辦法,自己想到就是這個(gè)土辦法。
1 查找到所有mvlog ;
2 找到所有涉及到的表的主鍵列;
3 查詢每個(gè)mvlog中的主鍵的值。
1 查詢所有的mvlog,找到表名和mvlog表名
1 SELECT MASTER, LOG_TABLE FROM DBA_MVIEW_LOGS WHERE LOG_OWNER = UPPER(?)
注:這里的參數(shù)和2的OWNER的參數(shù)值是一樣的,都是數(shù)據(jù)庫(kù)用戶名(登錄用的)。2 用1查詢到的每個(gè)表名去查詢那個(gè)表的主鍵列。
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(?) ";
注:參數(shù)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查詢到的每個(gè)mvlog表去查詢2查詢到的每個(gè)主鍵列的值
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 "
這樣就得到了,每個(gè)mvlog中的主鍵的值。
附錄:1創(chuàng)建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是表更新涉及的行號(hào),sequence是序列對(duì),自由添加。sequence (AREA_NM_R, AREA_NM_N) including new values;
2查詢mvlog
查詢mvlog和查詢表是一樣的,簡(jiǎn)單的查詢語(yǔ)句就可以。
1 select * from mlog$_marea
關(guān)于mvlog 的介紹目前只接觸到這些,To be continued...
文中涉及到的DBA_MVIEW_LOGS,DBA_CONSTRAINTS,DBA_IND_COLUMNS 也有必要介紹下,不過(guò)看字面意思還是能望而生義的...
------------------------------我是分割線----------------------------------
因?yàn)閷?duì)DBA表不甚了解,項(xiàng)目開(kāi)發(fā)的時(shí)候果然出了點(diǎn)問(wèn)題。
客戶后來(lái)要求不要用DBA的表,改用USER表。因?yàn)榭紤]到商用環(huán)境,用戶一般不會(huì)給予DBA權(quán)限。
所以兩段SQL文稍有修改:
1 查詢所有的mvlog,找到表名和mvlog表名
1
SELECT MASTER, LOG_TABLE FROM USER_MVIEW_LOGS
2 用1查詢到的每個(gè)表名去查詢那個(gè)表的主鍵列。
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的限制去掉了,因?yàn)閁SER表對(duì)應(yīng)的肯定是用戶本身,也就沒(méi)有必要限制了。
posted on 2009-06-15 17:24 游雯 閱讀(10330) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): Java編程技巧