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.
-- 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;
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
.
-- 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;
/
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.
SELECT * FROM schema_a.cmp$comparacao_ab;
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.
-- 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;
/
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.
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;
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
- Oracle Database PL/SQL Packages and Types Reference: DBMS_COMPARISON