DBMS_COMPARISONパッケージ で表データの比較 #3 Tweet
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つの表の内容を一致させてから再度比較してみる。
| 固定リンク | 0
コメント