Fala, galera. Tudo bem?
Hoje vou falar um pouco sobre o comando MERGE.
O MERGE é um comando DML que combina as funções de insert, update e delete. O uso do MERGE possibilita a combinação dos comandos citados de maneira mais eficiente do que fazê-los separadamente, o que o torna a opção preferencial.
Vamos ao exemplo, para trazer o funcionamento do comando irei criar as tabelas abaixo/ inserir alguns dados pra gente poder trabalhar.
CREATE TABLE TAB01(ID NUMBER
,NOME VARCHAR2(10))
/
CREATE TABLE TAB02(ID NUMBER
,NOME VARCHAR2(10))
/
INSERT INTO TAB01 VALUES(1, 'JOAO');
INSERT INTO TAB01 VALUES(2, 'MANOEL');
INSERT INTO TAB01 VALUES(3, 'ANTONIO');
INSERT INTO TAB01 VALUES(4, 'LUAN');
INSERT INTO TAB01 VALUES(5, 'ROGERIO');
--
INSERT INTO TAB02 VALUES(1, 'MARCOS');
INSERT INTO TAB02 VALUES(2, 'MARCELO');
INSERT INTO TAB02 VALUES(7, 'ANTONIO');
INSERT INTO TAB02 VALUES(8, 'LUAN');
INSERT INTO TAB02 VALUES(9, 'ROGERIO');
INSERT INTO TAB02 VALUES(10, 'DAVID');
COMMIT;
/
Query na tab01/ 02 p/ evidenciar os registros antes da execução do comando.
Obs: Note que os id's 1 e 2 existem em ambas as tabelas porém com nomes diferentes.
Sintaxe do comando (Retirada do Site Oficial da Oracle) https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm#SQLRF01606
Utilização do comando:
MERGE INTO TAB01
USING TAB02
ON (TAB01.ID = TAB02.ID)
WHEN MATCHED THEN
UPDATE SET TAB01.NOME = TAB02.NOME
DELETE WHERE TAB01.NOME = 'MARCOS'
WHEN NOT MATCHED THEN
INSERT VALUES(TAB02.ID, TAB02.NOME)
WHERE TAB02.ID >1;
O que foi feito no comando acima, fizemos um merge das linhas da tab02 na tab01, respeitando a condição definida no where onde só traria as linhas da tabela dois que tivessem o ID > 1 ou seja, é possível filtrar os registros, fizemos um update caso o mesmo id fosse encontrado nas duas tabelas, caso não fosse o registro seria inserido, também deletamos um dos registros na tab01, resultado:
Espero que gostem e até a próxima.
Leonardo Silva.