terça-feira, junho 26, 2012

Update a partir de uma select no Oracle

HI,

Passei a vida toda apenas utilizando o select/insert para popular uma tabela a partir do resultado de uma consulta. Mas ontem precisei além de inserir, também atualizar. Não queria executar a query duas vezes para fazer isso, um select/insert para inserir e um loop em outra query para atualizar.

Sabia que no MySql tem esse recurso de inserir se não existir, e se existir, atualizar. Então fui perguntar ao Google como fazer isso no Oracle. Descobri que existe o comando MERGE, que serviria para o meu propósito.

Comando MERGE
http://psoug.org/reference/merge.html


Agora vou relatar os problema que enfrentei para conseguir executá-lo.

Eu modifiquei a procedure e passou a ocorrer esse erro: ORA-00918: column ambiguously.

Passei um bom tempo para achar esse erro, já que analisando a query não via nenhum problema aparente já que todos os campos estavam precedidos por aliases. Ex:. a.id = b.id.

Pesquisando no google vi que o problema era a repetição de um campo na select. É que antes no select/insert, existiam dois campos que recebiam o mesmo valor: Insert into teste(id, viagens1, viagens2) select id, viagens, viagens from teste2.

Foi aqui que achei a solução para o problema ORA-00918: column ambiguously no MERGE
https://forums.oracle.com/forums/thread.jspa?messageID=10327846


Outro problema que enfrentei foi esse: ORA-30926: unable to get a stable set of rows in the source tables.

No teste para identificar se o registro existe ou não, coloquei apenas 1 campo e minha chave primaria possui 3 campos.

Achei a solução aqui
http://stackoverflow.com/questions/2337271/ora-30926-unable-to-get-a-stable-set-of-rows-in-the-source-tables

Um outro erro que acontece é se colocar um campo da chave primaria no update para ser atualizado.



Fiquem na Paz!!!



Nenhum comentário: