Pular para o conteúdo

DBMS_COMPARISON no Oracle: Guia Completo com Exemplos Práticos

DBMS_COMPARISON no Oracle: Guia Completo com Exemplos Práticos

Introdução

O Oracle 19c introduz diversos recursos poderosos para administração de banco de dados, e um dos mais úteis para a sincronização e comparação de dados é o pacote DBMS_COMPARISON. Este pacote permite comparar dados entre tabelas, views ou materialized views em um mesmo banco de dados ou em bancos de dados diferentes. Com ele, é possível identificar divergências e até mesmo sincronizar dados de forma automática.

Funcionalidades do DBMS_COMPARISON

O DBMS_COMPARISON oferece diversas funcionalidades, incluindo:

  • Criação de comparações
  • Execução de comparações
  • Identificação de diferenças
  • Sincronização de dados divergentes
  • Remoção de comparações

Exemplos Práticos

Exemplo Básico

Passo 1: Criação do Schema de Teste

Para começar, criaremos duas tabelas simples em dois esquemas diferentes para simular bancos de dados distintos.

SQL
-- No Schema A
CREATE TABLE schema_a.tabela_a (
    id NUMBER PRIMARY KEY,
    nome VARCHAR2(50),
    valor NUMBER
);

INSERT INTO schema_a.tabela_a VALUES (1, 'Item 1', 10);
INSERT INTO schema_a.tabela_a VALUES (2, 'Item 2', 20);
INSERT INTO schema_a.tabela_a VALUES (3, 'Item 3', 30);
COMMIT;

-- No Schema B
CREATE TABLE schema_b.tabela_b (
    id NUMBER PRIMARY KEY,
    nome VARCHAR2(50),
    valor NUMBER
);

INSERT INTO schema_b.tabela_b VALUES (1, 'Item 1', 10);
INSERT INTO schema_b.tabela_b VALUES (2, 'Item 2', 25);  -- Diferente do valor em tabela_a
INSERT INTO schema_b.tabela_b VALUES (4, 'Item 4', 40);  -- Adicional em relação à tabela_a
COMMIT;

SQL
Table created.

1 row created.

1 row created.

1 row created.

Commit complete.

Table created.

1 row created.

1 row created.

1 row created.

Commit complete.

Passo 2: Criação e Execução da Comparação

Em seguida, criaremos uma comparação usando DBMS_COMPARISON.

PLSQL
-- Criação da comparação
BEGIN
    DBMS_COMPARISON.CREATE_COMPARISON(
        comparison_name => 'comparacao_ab',
        schema_name1 => 'SCHEMA_A',
        object_name1 => 'TABELA_A',
        schema_name2 => 'SCHEMA_B',
        object_name2 => 'TABELA_B'
    );
END;
/

-- Execução da comparação
DECLARE
    comp_info DBMS_COMPARISON.COMPARISON_TYPE;
BEGIN
    DBMS_COMPARISON.COMPARE(
        comparison_name => 'comparacao_ab',
        scan_info => comp_info,
        perform_row_dif => TRUE,
        perform_column_dif => TRUE
    );
END;
/

PLSQL
PL/SQL procedure successfully completed.

PL/SQL procedure successfully completed.

Passo 3: Verificação de Diferenças

Após a execução da comparação, podemos verificar as diferenças encontradas.

SQL
SELECT * FROM schema_a.cmp$comparacao_ab;

SQL
  COMPARISON_NAME ROWID1  ROWID2   DIFFERENCE_DESCRIPTION
---------------- ------  ------   ----------------------
COMPARACAO_AB    AAACaQAAEAAAAFI AAAAAQAAEAAAACX Different values found in columns: VALOR
COMPARACAO_AB    AAACaQAAEAAAAFM <null>  Row missing in SCHEMA_B.TABELA_B
COMPARACAO_AB    <null>  AAAAAQAAEAAAACY Row missing in SCHEMA_A.TABELA_A

Exemplo Avançado: Sincronização de Dados

Vamos agora sincronizar as diferenças detectadas entre as tabelas.

Passo 1: Sincronização de Dados

Usaremos a função CONVERGE para sincronizar as diferenças.

PLSQL
-- Sincronização das tabelas
DECLARE
    comp_info DBMS_COMPARISON.COMPARISON_TYPE;
    converged BOOLEAN;
BEGIN
    converged := DBMS_COMPARISON.CONVERGE(
        comparison_name => 'comparacao_ab',
        scan_info => comp_info,
        local_schema => 'SCHEMA_A',
        converge_options => DBMS_COMPARISON.CMP_CONVERGE_OPTIONS
    );

    IF converged THEN
        DBMS_OUTPUT.PUT_LINE('Sincronização concluída com sucesso.');
    ELSE
        DBMS_OUTPUT.PUT_LINE('Existem diferenças que não puderam ser sincronizadas.');
    END IF;
END;
/

PLSQL
Sincronização concluída com sucesso.

PL/SQL procedure successfully completed.

Passo 2: Verificação Pós-Sincronização

Após a sincronização, verificamos novamente as diferenças para garantir que as tabelas estão alinhadas.

PLSQL
DECLARE
    comp_info DBMS_COMPARISON.COMPARISON_TYPE;
BEGIN
    DBMS_COMPARISON.COMPARE(
        comparison_name => 'comparacao_ab',
        scan_info => comp_info,
        perform_row_dif => TRUE,
        perform_column_dif => TRUE
    );
END;
/

SELECT * FROM schema_a.cmp$comparacao_ab;

PLSQL
PL/SQL procedure successfully completed.

no rows selected

Considerações Finais

O pacote DBMS_COMPARISON é uma ferramenta poderosa para administradores de banco de dados Oracle, proporcionando uma maneira eficiente de comparar e sincronizar dados entre tabelas em um mesmo banco de dados ou em bancos de dados diferentes. Este guia abordou desde a configuração básica até exemplos mais avançados de sincronização de dados. Para mais detalhes, a documentação oficial do Oracle é uma excelente fonte de referência.

Abs

Referências

Giovano Silva

Giovano Silva

Giovano Silva é um profissional com mais de 10 anos de experiência em tecnologias Oracle, com ênfase em PL/SQL. Ele adora escrever sobre soluções para problemas comuns enfrentados por profissionais Oracle em seu dia a dia. Seu objetivo é compartilhar conhecimento, simplificar conceitos complexos e ajudar a comunidade Oracle a crescer coletivamente.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress