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