Insert, Update e Delete com MERGE (Oracle)

Categoria: Oracle
Publicado em 19 de Junho de 2013

O comando MERGE pode ser usado para que de uma só vez, INSERT, UPDATE e DELETE sejam executados sobre os registros de uma tabela de acordo com o resultado de outra tabela, view ou subquery:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
MERGE INTO 
   TAB_AUDITORIA DESTINO
USING 
   TAB_COMPRAS ORIGEM
ON (
   DESTINO.FORNECEDOR_ID = ORIGEM.FORNECEDOR_ID
)
WHEN MATCHED THEN 
   UPDATE SET
      DESTINO.OBSERVACOES = ONT.OBSERVACOES
   DELETE WHERE 
      DESTINO.DATA_AUDITORIA < TO_DATE('01-JAN-13')
WHEN NOT MATCHED THEN 
   INSERT(
      DESTINO.AUDITORIA_ID, 
      DESTINO.FORNECEDOR_ID, 
      DESTINO.DATA_AUDITORIA, 
      DESTINO.OBSERVACOES
   ) VALUES (
      SEQ_AUDITORIA_ID.NEXTVAL, 
      ORIGEM.FORNECEDOR_ID, 
      SYSDATE, 
      ORIGEM.OBSERVACOES
   )
WHERE 
   TO_CHAR(ORIGEM.DAT_COMPRA, 'YYYY') = '2013'
;

No exemplo acima, a tabela de auditoria é preenchida com todas as compras realizadas no ano de 2013. Caso o registro já exista na tabela de auditoria, o registro somente é atualizado. Caso não exista, o registro é inserido. 

O DELETE das linhas 11 e 12 somente é aplicado aos registros que são alterados (via o comando UPDATE das linhas 9 e 10), e a tentativa de remoção ocorre imediatamente após o registro ser alterado.

A linha 2 é a tabela cujos registros serão afetados.

A linha 4 é a tabela cujos valores serão utilizados para atualizar os registros da outra tabela.

As linhas 5 a 7 é a condição relacional onde haverá a atualização de registros.

As linhas 25 a 27 representam restrições. Se não forem satisfeitas, o registro não será inserido/modificado.

 

Copyright © Fernando Hidemi Uchiyama 2010 - Todos os direitos reservados