Pular para o conteúdo

Comando MERGE: Uma abordagem PRÁTICA

Comando MERGE: Uma abordagem PRÁTICA

O comando MERGE é uma instrução SQL que permite combinar dados de duas ou mais tabelas em uma única operação. Ele pode ser usado para inserir, atualizar ou excluir registros de uma tabela alvo, dependendo de uma condição de correspondência com uma tabela fonte. O comando MERGE tem a seguinte sintaxe:

MERGE INTO tabela_alvo [alias1]
USING tabela_fonte [alias2]
ON (condição_de_correspondência)
WHEN MATCHED THEN
  UPDATE SET coluna1 = valor1 [, coluna2 = valor2 ...]
  WHERE condição_de_atualização
  DELETE WHERE condição_de_exclusão
WHEN NOT MATCHED THEN
  INSERT (coluna1 [, coluna2 ...]) VALUES (valor1 [, valor2 ...])
  WHERE condição_de_inserção;

A cláusula MERGE INTO especifica a tabela alvo que será modificada. A cláusula USING especifica a tabela fonte que fornece os dados para a operação. A cláusula ON especifica a condição de correspondência entre as duas tabelas, que deve resultar em um valor verdadeiro ou falso. A cláusula WHEN MATCHED THEN especifica as ações a serem executadas quando há uma correspondência entre as tabelas, que podem ser atualizar ou excluir registros da tabela alvo. A cláusula WHEN NOT MATCHED THEN especifica a ação a ser executada quando não há uma correspondência entre as tabelas, que é inserir registros na tabela alvo.

Para ilustrar o uso do comando MERGE, vamos usar os esquemas de amostra HR e OE do Oracle Database. Suponha que queremos sincronizar os dados dos funcionários entre as duas tabelas EMPLOYEES, uma no esquema HR e outra no esquema OE. Para isso, podemos usar o seguinte comando MERGE:

MERGE INTO oe.employees e
USING hr.employees h
ON (e.employee_id = h.employee_id)
WHEN MATCHED THEN
  UPDATE SET e.first_name = h.first_name,
             e.last_name = h.last_name,
             e.email = h.email,
             e.phone_number = h.phone_number,
             e.hire_date = h.hire_date,
             e.job_id = h.job_id,
             e.salary = h.salary,
             e.commission_pct = h.commission_pct,
             e.manager_id = h.manager_id,
             e.department_id = h.department_id
  WHERE e.last_name <> h.last_name OR
        e.email <> h.email OR
        e.phone_number <> h.phone_number OR
        e.hire_date <> h.hire_date OR
        e.job_id <> h.job_id OR
        e.salary <> h.salary OR
        e.commission_pct <> h.commission_pct OR
        e.manager_id <> h.manager_id OR
        e.department_id <> h.department_id
  DELETE WHERE h.end_date IS NOT NULL
WHEN NOT MATCHED THEN
  INSERT (e.employee_id, e.first_name, e.last_name, e.email, 
          e.phone_number, e.hire_date, e.job_id, e.salary, 
          e.commission_pct, e.manager_id, e.department_id)
  VALUES (h.employee_id, h.first_name, h.last_name, h.email, 
          h.phone_number, h.hire_date, h.job_id, h.salary, 
          h.commission_pct, h.manager_id, h.department_id)
  WHERE h.end_date IS NULL;

Esse comando irá atualizar os registros da tabela OE.EMPLOYEES com os dados da tabela HR.EMPLOYEES quando os IDs dos funcionários forem iguais, mas algum outro campo for diferente. Ele irá excluir os registros da tabela OE.EMPLOYEES quando os IDs dos funcionários forem iguais, mas o campo END_DATE da tabela HR.EMPLOYEES não for nulo. Ele irá inserir os registros na tabela OE.EMPLOYEES com os dados da tabela HR.EMPLOYEES quando os IDs dos funcionários não forem iguais e o campo END_DATE da tabela HR.EMPLOYEES for nulo.

Espero que este artigo tenha te ajudado a entender melhor o comando MERGE do Oracle SQL.

Abs

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