« Dashboard de Aquarium - 祝! 10000アクセス突破! | トップページ | DBMS_COMPARISONパッケージ で表データの比較 #4 »

2007年10月11日 (木) / Author : Hiroshi Sekiguchi.

DBMS_COMPARISONパッケージ で表データの比較 #3

DBMS_COMPARISONパッケージで表データの比較の続きです。

バックナンバー:
DBMS_COMPARISONパッケージ で表データの比較 #1
DBMS_COMPARISONパッケージ で表データの比較 #2



前回は、2つの表を比較し内容が同一であることを確認した。というところまでだった。今回は、emp/emp2の内容が異なっている場合の例を。

● まず、emp表、emp2表で内容の一致しないデータを準備しておく。

SCOTT> 
SCOTT> insert into emp values(9999,'DISCUS','ANALYST',7839,sysdate,3000,null,20);

1行が作成されました。

SCOTT> insert into emp2 values(8888,'NEON','CLERK',7839,sysdate,1300,null,20);

1行が作成されました。

SCOTT> insert into emp values(7000,'PLECO','MANAGER',7839,sysdate,2500,null,30);

1行が作成されました。

SCOTT> insert into emp2 values(7000,'PLEGO','MANAGER',7839,sysdate,2500,null,30);

1行が作成されました。

SCOTT> commit;

コミットが完了しました。

SCOTT>

● COMPARE関数で比較してみる。

SCOTT> l
1 DECLARE
2 isSame BOOLEAN;
3 scanInfo DBMS_COMPARISON.COMPARISON_TYPE;
4 BEGIN
5 isSame := DBMS_COMPARISON.COMPARE(
6 comparison_name => 'EMP表の比較'
7 ,scan_info => scanInfo
8 ,perform_row_dif => true
9 );
10 DBMS_OUTPUT.PUT_LINE('========= 結果 =======');
11 DBMS_OUTPUT.PUT_LINE('scan_id='||TO_CHAR(scanInfo.scan_id));
12 IF isSame THEN
13 DBMS_OUTPUT.PUT_LINE('EMP表とEMP2表の内容は同じです。');
14 ELSE
15 DBMS_OUTPUT.PUT_LINE('EMP表とEMP2表の内容に違いがあります。');
16 END IF;
17* END;
SCOTT> /
========= 結果 =======
scan_id=2
EMP表とEMP2表の内容に違いがあります。

PL/SQLプロシージャが正常に完了しました。

SCOTT>

● user_comparison_scan_summaryビューや、user_comparison_row_difビューなどで比較結果を確認。

尚、2票間に同一キーを持つデータは存在するがキー以外の列値が異なっている場合、どの列値が異なっているか? というところまで確認することはできない。
SCOTT> l
1 select
2 c.comparison_name,
3 s.scan_id,
4 s.current_dif_count
5 from
6 user_comparison c join user_comparison_scan_summary s
7 on c.comparison_name = s.comparison_name
8 where
9* s.scan_id = 2
SCOTT> /

COMPARISON_NAM SCAN_ID CURRENT_DIF_COUNT
-------------- ---------- -----------------
EMP表の比較 2 3

SCOTT>
SCOTT> l
1 select
2 s.root_scan_id as scan_id,
3 s.comparison_name,
4 d.index_value,
5 s.status,
6 case
7 when local_rowid is not null
8 and remote_rowid is not null then
9 'ローカル表、リモート表に同一キーを持つ行が存在しますが、キー以外で列値に違いがあります。'
10 when local_rowid is null
11 and remote_rowid is not null then
12 'ローカル表に存在しない行がリモート表に存在します。'
13 when local_rowid is not null
14 and remote_rowid is null then
15 'ローカル表に存在する行がリモート表に存在しません。'
16 end as description
17 from
18 user_comparison_scan_summary s join user_comparison_row_dif d
19 on s.scan_id = d.scan_id
20 where
21 s.root_scan_id = 2
22 and s.parent_scan_id is not null
23 order by
24* d.index_value
SCOTT> /

SCAN_ID COMPARISON_NAME INDEX_VAL STATUS DESCRIPTION
---------- -------------------- --------- ---------------- ---------------------------------------------------------------------------
2 EMP表の比較 7000 ROW DIF ローカル表、リモート表に同一キーを持つ行が存在しますが、キー以外で列値に違いがあります。
2 EMP表の比較 8888 ROW DIF ローカル表に存在しない行がリモート表に存在します。
2 EMP表の比較 9999 ROW DIF ローカル表に存在する行がリモート表に存在しません。

SCOTT>

今日はここまで。
次回は、2つの表の内容を一致させてから再度比較してみる。

| |

トラックバック


この記事へのトラックバック一覧です: DBMS_COMPARISONパッケージ で表データの比較 #3:

コメント

コメントを書く