このチュートリアルでは、OracleのDBMS_COMPARISONユーティリティパッケージを使用して、異なるスキーマの2つのデータベーステーブルオブジェクトを比較する例を示します。
DBMS_COMPARISONを使用してOracleの2つのテーブルオブジェクトを比較する手順
ステップ1 DBMS_COMPARISONを使用して比較を作成します。次の例では、同じデータベース内のSCOTTスキーマの1つのテーブルとHRスキーマの1つのテーブルを比較し、 emp_compareという名前の比較を作成します。 。
BEGIN DBMS_COMPARISON.create_comparison ( comparison_name => 'emp_compare', schema_name => 'scott', object_name => 'emp', dblink_name => NULL, remote_schema_name => 'hr', remote_object_name => 'emp2'); END; /
出力:
PL/SQL procedure successfully completed.
ステップ2 上記のPL/SQLブロックを実行した後、比較が作成されます。次のステップは、以下に示すようにこの比較を実行することです。
SET SERVEROUTPUT ON DECLARE t_scan_info DBMS_COMPARISON.comparison_type; l_diff BOOLEAN; BEGIN l_diff := DBMS_COMPARISON.compare ( comparison_name => 'emp_compare', scan_info => t_scan_info, perform_row_dif => TRUE ); IF NOT l_diff THEN DBMS_OUTPUT.put_line('Differences found and scan_id is ' || t_scan_info.scan_id); ELSE DBMS_OUTPUT.put_line('No differences found.'); END IF; END; /
出力:
Differences found and scan_id is 7 PL/SQL procedure successfully completed.
ステップ3 違いが見つかった場合は、次のクエリで違いを確認できます:
SELECT comparison_name, local_rowid, remote_rowid, status FROM user_comparison_row_dif WHERE comparison_name = 'EMP_COMPARE';
出力:
COMPARISON_NAME LOCAL_ROWID REMOTE_ROWID STATUS EMP_COMPARE AAAR3sAAEAAAACXAAA AAAU5vAAEAAAAW9AAA DIF EMP_COMPARE AAAR3sAAEAAAACXAAD AAAU5vAAEAAAAW9AAD DIF
上記のような出力が得られます。ここには、比較名、ローカル行ID(scott.empテーブル行ID)、リモート行ID(hr.emp2テーブル行ID)、およびステータスが表示されます。
これで、両方のテーブルでこれらのROWIDを照会して、違いを確認できます。
以下の例に示すように、SQLクエリを使用して異なるスキーマの2つのテーブルデータを比較することもできます。
SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO FROM scott.emp MINUS SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO FROM hr.emp2;
関連項目:
- PL/SQLの例で文字列を分割する
- Oracle DUMP(dmpファイル)からDDLステートメントを抽出します