Adalberto,

Basicamente, o MERGE faz mais rápido o que uma trigger usando EXCEPTION
faria em uma inclusão onde pode acontecer duplicação de PK, que no caso vc
iria querer que a rotina fizesse a atualização dos atributos.

Abaixo, um exemplo de utilização de MERGE em duas tabelas que usamos aqui.

A idéia é a seguinte: existe uma tabela que contém os dados
(SIM_VALIDACAO_ARQUIVO), e estes dados serão tratados e inseridos em outra
tabela. Se houver duplicidade, fazer o update, senão fazer o INSERT.

-- Inserção dos Dados Consolidados
merge into sim_ultima_utilizacao_cartao
    using (
       SELECT NR_PRODUTO, NR_INTERNO, MAX(DT_VALIDACAO) dt_validacao
          FROM SIM_VALIDACAO_ARQUIVO
       WHERE
          NR_PRODUTO >= 182
          AND dt_operacao >= '29/05/06'
       GROUP BY nr_produto, nr_interno ) SVA
 on (sva.nr_produto = sim_ultima_utilizacao_cartao.nr_produto
    and sva.nr_interno = sim_ultima_utilizacao_cartao.nr_interno)
 when matched then
    update set dt_max_validacao = sva.dt_validacao
 when not matched then
    insert (nr_produto, nr_interno, dt_max_validacao) 
        values (sva.nr_produto, sva.nr_interno, sva.dt_validacao);

        
-- Popular a SIM_UTILIZACAO_DIARIA_CARTAO                  
merge into sim_utilizacao_diaria_cartao sud
using (select
   nr_produto
   , nr_interno
   , trunc(dt_validacao) dt_validacao
   , count(*) qtde
from
   sim_validacao_arquivo
where
   dt_operacao >= '31/05/2006'
   AND DT_OPERACAO <= '05/06/2006'
   AND (NR_PRODUTO = 182 OR NR_PRODUTO = 202 OR NR_PRODUTO > 209)
group by
    nr_produto
    , nr_interno
    , trunc(dt_validacao)) sva
on (sva.nr_produto = sud.nr_produto
   and sva.nr_interno = sud.nr_interno
   and sva.dt_validacao = sud.dt_validacao
)
when matched then
   update set sud.qt_validacoes = sud.qt_validacoes + sva.qtde
when not matched then
   insert (nr_produto, nr_interno, dt_validacao, qt_validacoes)
   values (sva.nr_produto, sva.nr_interno, sva.dt_validacao, sva.qtde);


 
Ederson Elias de Oliveira
DBA Oracle
Setransp - Goiânia-GO
-------------------------------------------------------------------

-----Mensagem original-----
De: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em
nome de Adalberto de Sousa Monteiro
Enviada em: quinta-feira, 29 de junho de 2006 17:44
Para: oracle_br@yahoogrupos.com.br
Assunto: Re: [oracle_br] Ajuda com MERGE - DESCULPEM MINHA INSISTÊNCIA ...
MAS !!


----- Original Message ----- 
From: "Adalberto de Sousa Monteiro" <[EMAIL PROTECTED]>
To: <oracle_br@yahoogrupos.com.br>
Sent: Wednesday, June 28, 2006 1:39 PM
Subject: [oracle_br] Ajuda com MERGE


Boa tarde a todos,
Alguem poderia me ajudar com o comando abaixo ? Estou tentando executa-lo e
ele está se perdendo.

Desculpa ai pessoal, é a primeira vez que utilizo esse comando.

Desde ja agradeço a todos
Adalberto
MERGE INTO VIAGEM ccviagem
USING ( select viagem.codfil,
viagem.numero,
to_char(viagem.dtemis,'DD/MM/YYYY') dtemis,
viagem.codcav,
viagem.codcar,
viagem.codmot,
viagem.codfro,
viagem.tpoper,
viagem.tpviag,
viagem.qtdnfs
from logistic.afa037 viagem
where to_char(viagem.datalt, 'DD/MM/YYYY') between vs_dtInicial and
vs_dtFinal
) lcviagem
on ( lcviagem.codfil = ccviagem.CD_FILVIA
and lcviagem.numero = ccviagem.NR_VIAGEM
)
WHEN MATCHED THEN
UPDATE SET ccviagem.DT_ALTERACAO = sysdate
WHEN NOT MATCHED THEN
INSERT ( CD_EMPRESA,
CD_FILIAL,
CD_FILVIA,
NR_VIAGEM,
DT_EMISSAO,
CD_FROTA,
CD_CARRETA,
CD_MOTORISTA,
CD_FROTISTA,
CD_TPOPERACAO,
CD_TPVIAGEM,
QT_NF,
DT_CADASTRO
)
VALUES ( 1,
1,
lcviagem.codfil,
lcviagem.numero,
lcviagem.dtemis,
lcviagem.codcav,
lcviagem.codcar,
lcviagem.codmot,
lcviagem.codfro,
lcviagem.tpoper,
lcviagem.tpviag,
lcviagem.qtdnfs,
sysdate
);




--------------------------------------------------------------------------------------------------------------------------
Atenção! As mensagens deste grupo são de acesso público e de inteira 
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--------------------------------------------------------------------------------------------------------------------------__________________________________________________________________

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 
__________________________________________________________________
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o 
link do mesmo para evitar trafego(pedidos) desnecessário. 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 


Responder a