SQL Oracle cursor

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Vinicius Brasil
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Ter, 15 Jul 2014 3:58 pm

Prezados poderiam me ajudar? Gostaria de realizar um cursor ou algo assim mas não consigo aprender, mesmo sendo basico rs..

Tenho duas tabelas

Tabela1 e Tabela 2

Estas duas tabelas tem um codigo unico como referencia ou seja:

tabela1.codigo = tabela2.codigo

Tenho que fazer um update na tabela1 com os dados da tabela2 validando a coluna codigo.

ou seja:

o update simples seria:

Selecionar tudo

update tabela1 set teste1(valor a ser alterado) = @teste2 (valor na tabela 2 correto)
where tabela1.codigo = tabela2.codigo
Será que deu para entender?

Agradeço a ajuda.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

No caso você precisa alterar os valores de uma tabela baseando nos valores de outra tabela.
É possível fazer um pequeno programa, que pode se utilizar de cursor.
Mas o mais simples é fazer um update com as corretas condições de existência e cardinalidade entre as tabelas envolvidas.
Segue exemplo:

Selecionar tudo

update tabela1 t1
   set t1.campo = ( select t2.campo_origem
                      from tabela2 t2
                     where t1.chave = tabela2.chave     
                     )
where EXISTS ( select 1
                 from tabela2 t2
                where t1.chave = tabela2.chave     
               );
É possível que na chamada do subselect retorne mais de uma linha/valor , o que dá um erro na execução. Dependendo do caso pode ser resolvido, corretamente, com o group by no subselect. Mas vai depender da análise de como são os dados e seus relacionamentos.
Vinicius Brasil
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Ter, 15 Jul 2014 3:58 pm

Cara não sei nem como agradecer, sua ideia foi linda e de uma forma super simples!

Olha como resolvi com a sua ideia:

Selecionar tudo

update vinicius t1
   set t1.loca_populacao_atual = ( select t2.loca_populacao_atual
                      from ecl_localidade t2
                     where t1.loca_cod_cnl = t2.loca_cod_cnl
                     AND ROWNUM = 1    
                     )
                     --where loca_cod_cnl = 11763
where EXISTS ( select 1
                 from ecl_localidade t2
                where t1.loca_cod_cnl = t2.loca_cod_cnl     
               );
Realmente deu o erro que você informou:

Selecionar tudo

ORA-01427: single-row subquery returns more than one row
sendo assim não usei o group by e sim AND ROWNUM = 1, não sei porque mas resolveu rs...

Nossa fiquei muito feliz de ter funcionado!

Agora so mais uma ajudinha rs.. Sempre assim ne?

Tem como você me indicar algum lugar ou apostila para aprender a fazer cursor, função pois sempre quiz aprender a declarar variavel e colocar um loop, while mas so consigo modificar pouco um codigo para adaptar para meu uso mas criar um não entra na minha cabeça.

Obrigado..
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Como disse, é preciso avaliar os dados e os relacionamentos para definir, no caso do subselect retornar mais de uma linha, se realmente é possível fazer um agrupamento (ou um rownum) ou não.

Quanto ao material, acredito que qualquer pesquisa aí pela internet, google, você encontre um farto material de plsql até em português. Se souber inglês aí não tem limites... :)
Bons estudos.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 17 visitantes