Duvida sobre cursores implicitos

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
abarbosa
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Qui, 24 Mai 2012 10:11 pm

Boa noite a todos.
Pessoal estou trabalhando a pouco tempo com plsql,gostaria de saber como utilizar os famosos cursores implicitos aninhados.

já procurei no forum informações e só encontrei algumas dicas sobre o tema,porem avançadas para quem ainda não entendo o funcionamento do mesmos e em varios materiais o assunto é muito pouco abordado.

A risca da explicação poderia ser mais ou menos conforme abaixo:


begin
for i in ( select *
from employees )loop

for j in (select *
from departments) loop

end;


end;

já vi muito esse tipo de cursores em funções e procedimentos porem não consegui entender muito bem.Sei que as vezes usamos para fazer joins.


Caso tenha algum tópico sobre este assunto abordando o mesmo de forma basica,favor desconsiderar esse tópico.

Obrigado.
abarbosa
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Qui, 24 Mai 2012 10:11 pm

Pessoal postei o código acima e esqueci de finalizar os dois laços.


faltou a finalização dos dois loops,o codigo ficaria assim:

begin

for i in (select *
from employees)loop

for jin (select
* from departments)loop


end loop; //finaliza loop interno

end loop; //finaliza loop externo

end;
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Geralmente quando se vê o código com dois loops como você citou:

Selecionar tudo

BEGIN
  FOR i IN (SELECT * FROM employees)
  LOOP
    FOR jin IN (SELECT * FROM departments)
    LOOP
      -- sua lógica
    END LOOP;
  END LOOP;
END;
Provavelmente a intenção era fazer a junção das duas tabelas. Se for mesmo, o melhor é não aninhar loops, e sim fazer o join no próprio select do cursor:

Selecionar tudo

BEGIN
  FOR i IN (SELECT *
              FROM employees e
              JOIN departments d ON e.department_id = employees.department_id)
  LOOP
    -- sua lógica
  END LOOP;
END;
Onde coloquei "sua lógica", dependendo do que você precisa fazer, é bem possível que a melhor forma de realizar essa lógica seja no próprio Select. Ou seja: o melhor que você pode fazer é não usar cursor, e tentar resolver tudo num insert/update/delete ou numa sequência de inserts/updates/deletes sem loops.
abarbosa
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Qui, 24 Mai 2012 10:11 pm

Boa tarde,
Obrigado pela explicação.Infelizmente nem sempre da pra fucgir da utilização dos cursores.

Pode fechar o tópico.

Obrigado. :-o
Responder
  • Informação
  • Quem está online

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