DBMS_COMPARISONパッケージ で表データの比較 #2 Tweet
DBMS_COMPARISONパッケージで表データの比較の続きです。
バックナンバー:
DBMS_COMPARISONパッケージ で表データの比較 #1
DBMS_COMPARISONパッケージを利用し2つの表を比較!。(今回は、同一データベース、同一スキーマ内でテーブルの内容を比較してみることにする。)
● 表データを比較する手順
・COMPARISONを作成する。
(比較仕様を作成する。 とでも書いたほうがわかりやすいか?。。。)
・作成したCOMPARISONを元に比較する。
(比較仕様を元に比較を実行する。 とでも書いたほうがわかりやすいか?。。。)
では、比較実験開始!
emp表を複製してemp2表を作成する。(まずは、表、索引まで完全に複製して比較。)
SCOTT> create table emp2 as select * from emp;
表が作成されました。
SCOTT>
SCOTT> alter table emp2 add constraint emp2_pk primary key (empno);
表が変更されました。
SCOTT>
SCOTT> select * from emp order by empno;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80-12-17 800 NULL 20
7499 ALLEN SALESMAN 7698 81-02-20 1600 300 30
7521 WARD SALESMAN 7698 81-02-22 1250 500 30
7566 JONES MANAGER 7839 81-04-02 2975 NULL 20
7654 MARTIN SALESMAN 7698 81-09-28 1250 1400 30
7698 BLAKE MANAGER 7839 81-05-01 2850 NULL 30
7782 CLARK MANAGER 7839 81-06-09 2450 NULL 10
7788 SCOTT ANALYST 7566 87-04-19 3000 NULL 20
7839 KING PRESIDENT NULL 81-11-17 5000 NULL 10
7844 TURNER SALESMAN 7698 81-09-08 1500 0 30
7876 ADAMS CLERK 7788 87-05-23 1100 NULL 20
7900 JAMES CLERK 7698 81-12-03 950 NULL 30
7902 FORD ANALYST 7566 81-12-03 3000 NULL 20
7934 MILLER CLERK 7782 82-01-23 1300 NULL 10
14行が選択されました。
SCOTT> select * from emp2 order by empno;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80-12-17 800 NULL 20
7499 ALLEN SALESMAN 7698 81-02-20 1600 300 30
7521 WARD SALESMAN 7698 81-02-22 1250 500 30
7566 JONES MANAGER 7839 81-04-02 2975 NULL 20
7654 MARTIN SALESMAN 7698 81-09-28 1250 1400 30
7698 BLAKE MANAGER 7839 81-05-01 2850 NULL 30
7782 CLARK MANAGER 7839 81-06-09 2450 NULL 10
7788 SCOTT ANALYST 7566 87-04-19 3000 NULL 20
7839 KING PRESIDENT NULL 81-11-17 5000 NULL 10
7844 TURNER SALESMAN 7698 81-09-08 1500 0 30
7876 ADAMS CLERK 7788 87-05-23 1100 NULL 20
7900 JAMES CLERK 7698 81-12-03 950 NULL 30
7902 FORD ANALYST 7566 81-12-03 3000 NULL 20
7934 MILLER CLERK 7782 82-01-23 1300 NULL 10
14行が選択されました。
SCOTT>
create_comparison関数でcomparisonを作成する。
2つの表(empとemp2)は、どちらも同一データベースのSCOTTスキーマに存在するため、dblink_name引数にはnullを指定する。
SCOTT> l
1 begin
2 dbms_comparison.create_comparison(
3 comparison_name => 'EMP表の比較'
4 ,schema_name => 'SCOTT'
5 ,object_name => 'EMP'
6 ,dblink_name => null
7 ,remote_schema_name => 'SCOTT'
8 ,remote_object_name => 'EMP2'
9 );
10* end;
SCOTT> /
PL/SQLプロシージャが正常に完了しました。
SCOTT>
作成されたcomparisonを確認するには、user_comparisonビュー/user_comparison_columnsビュー問い合わせる
SCOTT> l
1 select
2 comparison_name
3 ,scan_mode
4 ,schema_name||'.'||object_name||'(type='||object_type||')' as local
5 ,remote_schema_name||'.'||remote_object_name||'(type='||remote_object_type||')' as remote
6 ,dblink_name
7 ,last_update_time
8 from
9 user_comparison
10 where
11* comparison_name = 'EMP表の比較'
SCOTT> /
COMPARISON_NAME SCAN_MODE LOCAL REMOTE DBLINK_NAME LAST_UPDATE_TIME
--------------- --------- -------------------------- -------------------------- ----------- ------------------------------
EMP表の比較 FULL SCOTT.EMP(type=TABLE) SCOTT.EMP2(type=TABLE) NULL 07-10-06 15:58:36.665370
SCOTT>
SCOTT> select * from user_comparison_columns order by column_position;
COMPARISON_NAME COLUMN_POSITION COLUMN_NAME I
------------------------------ --------------- ------------------------------ -
EMP表の比較 1 EMPNO Y
EMP表の比較 2 ENAME N
EMP表の比較 3 JOB N
EMP表の比較 4 MGR N
EMP表の比較 5 HIREDATE N
EMP表の比較 6 SAL N
EMP表の比較 7 COMM N
EMP表の比較 8 DEPTNO N
8行が選択されました。
SCOTT>
● compare関数を利用して比較する。
事前に作成されたcomparisonを元に、compare関数を利用して比較を行う。この時、比較処理事に採版されるscan_idを記録しておくとよいだろう。
scan_idは、内容に相違がある場合、その詳細をディクショナリビューから問い合わせたり、再比較する際に利用する。
SCOTT> set serveroutput on format wrapped
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=1
EMP表とEMP2表の内容は同じです。
PL/SQLプロシージャが正常に完了しました。
SCOTT>
ということで、次回は表の内容が異なっている場合はどうなるかという例を。
| 固定リンク | 0
コメント