Neste tutorial, estou dando um exemplo para comparar dois objetos de tabela de banco de dados de esquemas diferentes usando o pacote utilitário DBMS_COMPARISON no Oracle.
Etapas para comparar dois objetos de tabela no Oracle usando DBMS_COMPARISON
Etapa 1 Crie a comparação usando DBMS_COMPARISON. No exemplo a seguir, ele comparará uma tabela do esquema SCOTT e uma tabela do esquema HR no mesmo banco de dados e criará uma comparação chamada 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; /
Saída:
PL/SQL procedure successfully completed.
Etapa 2 Após executar o bloco PL/SQL acima, a comparação seria criada. A próxima etapa é executar essa comparação conforme mostrado abaixo.
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; /
Saída:
Differences found and scan_id is 7 PL/SQL procedure successfully completed.
Etapa 3 Se forem encontradas diferenças, você poderá verificar as diferenças pela seguinte consulta:
SELECT comparison_name, local_rowid, remote_rowid, status FROM user_comparison_row_dif WHERE comparison_name = 'EMP_COMPARE';
Saída:
COMPARISON_NAME LOCAL_ROWID REMOTE_ROWID STATUS EMP_COMPARE AAAR3sAAEAAAACXAAA AAAU5vAAEAAAAW9AAA DIF EMP_COMPARE AAAR3sAAEAAAACXAAD AAAU5vAAEAAAAW9AAD DIF
Você obterá a saída como mostrado acima. No qual ele mostrará o nome da comparação, o id da linha local (id da linha da tabela scott.emp), o id da linha remota (id da linha da tabela hr.emp2) e o status.
Agora você pode consultar ambas as tabelas desses ROWIDs para verificar as diferenças.
Você também pode comparar os dados das duas tabelas do esquema diferente usando a consulta SQL, conforme mostrado no exemplo abaixo.
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;
Veja também:
- Dividir uma string no exemplo PL/SQL
- Extrair instruções DDL do Oracle DUMP (arquivo dmp)