sql >> データベース >  >> RDS >> Oracle

Oracleで2つのデータベースオブジェクトを比較する方法は?

    このチュートリアルでは、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ステートメントを抽出します
    1. 複数行のクエリにはpsqlの\copyを使用します

    2. ExcelデータをPostgreSQL9.3にインポートします

    3. pgBackRestを使用してPostgreSQLとTimescaleDBをバックアップする方法

    4. pg-promiseで親と子のツリーを取得します