MERGE é um comando DML (Data Manipulation Language), assim como INSERT, DELETE e UPDATE. Apesar de não ser tão conhecido e usado quanto os outros DML’s, o MERGE merece uma atenção especial por ser um comando muito útil em vários tipos de casos, como sincronização de dados entre diferentes tabelas, carga de dados em processos ETL, entre outros.
Vamos para a parte prática, pois acredito que esta seja a maneira mais fácil de entender esta funcionalidade e de aprender como funciona.
Primeiro vou conectar ao schema HR e criar uma tabela para fazer os testes.
Criei uma tabela chamada “moto2”, com a mesma estrutura da tabela “moto”, que é uma tabela muito simples, conforme podem conferir abaixo:
Agora vamos aos comandos MERGE!
O que fez o comando acima? Vamos para a “tradução”!
O comando MERGE foi aplicado na tabela “moto2“, usando como base a tabela “moto“. A chave de comparação entre as duas tabelas foi o campo “moto_id“, que é a chave primária das duas tabelas. Isso foi definido nas cláusulas USING e ON, respectivamente.
A cláusula WHEN MATCHED THEN disse o seguinte: “sempre que encontrar um registro na tabela moto em que a chave primária já exista na tabela moto2, atualize o campo dono da tabela moto2 com o valor do campo dono da tabela moto.”
A cláusula WHEN NOT MATCHED THEN disse o seguinte: “se um registro da tabela moto não foi encontrado na tabela moto2, tomando como base o campo moto_id, então insira o registro correspondente na tabela moto2“.
O exemplo acima foi bem simples. Após o comando, a tabela moto2, que antes estava vazia, ficou idêntica a tabela moto:
Você pode estar se perguntando: fiz esse comando enorme apenas para deixar as tabelas iguais? Calma! Como a tabela moto2 estava vazia, sim, ele fez isso. Usando o mesmo comando MERGE novamente, ele fará as alterações de forma incremental. Vamos pra mais um exemplo, na sequência do que fizemos acima:
Alteramos a tabela moto, agora vamos consultar os dados das 2 tabelas, para ver as diferenças:
A diferença das duas tabelas são apenas 2 registros: o de moto_id = 6, onde o campo “dono” está diferente, e o moto_id = 8, que não existe na tabela moto2. Agora vamos rodar o MERGE novamente:
O comando MERGE atualizou os dados da tabela moto2 conforme o especificado, ou seja, o registro que não existia foi inserido. E o registro que estava diferente foi alterado. Importante ver que o comando só especificou UPDATE no campo dono, portanto, se eu alterar o campo moto_nome na tabela moto, essa alteração não será refletida na tabela moto2 com o comando MERGE.
Outra cláusula que pode ser usada é a DELETE. Vamos preparar o caso para testar essa cláusula:
Conferindo novamente os dados das duas tabelas:
E finalmente o comando MERGE usando a cláusula DELETE:
O MERGE atualizou o registro 5, atualizando o campo dono para o valor 103, e também apagou os registros 8 e 9, obedecendo a condição especificada (dono = 102).
Milton,
Muito legal, realmente o MERGE é muito pouco conhecido, com certeza quem desenvolve em PL/SQL e precisa fazer ETL é algo a se aprender, ou pelo menos saber para que ele funciona, então para isso só ler o post, ficou muito bom, parabéns.
capin
E ae Milton.
Cara ficou bem explicado viu, o comando merge é uma ótima opção para quem tem problemas com tabelas que precisam ser atualizadas em bds produção e homologação…
Parabéns.
Emerson
Fala 1000tão !
Realmente esse comando é muito útil.
Muito bom o artigo, aliás, todo o site.
Parabéns !
Abraço !
Fala Plínio!
Valeu, obrigado pela visita!
Abraço!
Olá Milton !
Segundo o Ishii o merge pode ser usado para alterar a pk de um tabela pai e atualizar os seus filhos. Mas não consegui ver como fazer isso…
Segue a discussão do problema:
http://profissionaloracle.com.br/modules.php?name=Forums&file=viewtopic&t=5370
Como resolver o problema do nosso amigo usando merge ?
Att,
Sakamoto
MyTraceLog – Registro de um DBA
http://mytracelog.blogspot.com
Muito bom… claramente detalhado
Cara,
nunca usei o MERGE. Com esses exemplos ai vou começar a usar.
Parabens !!!!