Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

cadmiel

Cursor com parâmetro dentro de loop

Recommended Posts

Boa tarde galera,

 

sou iniciante em plsql e gostaria de saber por que apesar do cursor CRS_ENDERECOS estar dentro do loop o parâmetro CLIENTE.ID é sempre o mesmo passado no cursor[CRS_ENDERECOS] ? Como faço para resolver esse problema ?

O que não consigo entender é que na saida do output ele não repete, não é sempre mesmo, não consigo entender rs

 

Acredito que seja algum bem simples, e eu estou penando para resolver esse probleminha rs.

DECLARE
  VALOR CLIENTE.NOME%TYPE;
  CURSOR CRS_CLIENTES IS
  SELECT * FROM CLIENTE;
BEGIN

DECLARE
  CURSOR CRS_ENDERECOS(CLIENTE_ID NUMBER) IS
  SELECT NUMERO FROM ENDERECO
  WHERE ENDERECO.CLIENTE_ID=CLIENTE_ID;
  VL ENDERECO.NUMERO%TYPE;
  BEGIN 
    
    FOR CLIENTE IN CRS_CLIENTES LOOP 
      OPEN CRS_ENDERECOS(CLIENTE.ID);
           FETCH CRS_ENDERECOS INTO VL;       
      DBMS_OUTPUT.put_line('ID: '|| CLIENTE.ID || ' Nome: ' || CLIENTE.NOME || ' NUMERO: ' || VL);    
      CLOSE CRS_ENDERECOS;
    END LOOP;   
  
  END;  
END;

flw :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vc precisa de 2 for

 

For para clientes

____For para enderecos

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Motta por quê sendo q o cursor CRS_ENDERECOS apenas retorna um registro ou uma row ?

Isso que gostaria de saber, eu não consigo entender.

 

Como você recomendou criei um segundo loop porem agora para o cursor CRS_ENDERECOS, a consulta está duplicando, tem ideia do por quê?

 

DECLARE
  VALOR CLIENTE.NOME%TYPE;
  CURSOR CRS_CLIENTES IS
  SELECT * FROM CLIENTE;
BEGIN

DECLARE
  CURSOR CRS_ENDERECOS(CLIENTE_ID NUMBER) IS
  SELECT NUMERO FROM ENDERECO
  WHERE ENDERECO.CLIENTE_ID=CLIENTE_ID;
  VL ENDERECO.NUMERO%TYPE;
  BEGIN 
    
    FOR CLIENTE IN CRS_CLIENTES LOOP 
      FOR ENDERECO IN CRS_ENDERECOS(CLIENTE.ID) LOOP       
          DBMS_OUTPUT.put_line('ID: '|| CLIENTE.ID || ' Nome: ' || CLIENTE.NOME || ' NUMERO: ' || ENDERECO.NUMERO);    
      END LOOP;  
    END LOOP;   
  
  END;  
END;
Alguma ideia do por que está duplicando ?

 

vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites


DECLARE

VALOR CLIENTE.NOME%TYPE;

;

BEGIN

FOR RC IN (SELECT * FROM CLIENTE)

LOOP

FOR RE IN (SELECT NUMERO

FROM ENDERECO

WHERE ENDERECO.CLIENTE_ID=RC.CLIENTE_ID)

LOOP

-- FAZ O QUE DE FAZER

END LOOP;

END LOOP;

END;

Compartilhar este post


Link para o post
Compartilhar em outros sites
DECLARE
  VALOR CLIENTE.NOME%TYPE;
  ;
BEGIN
  FOR RC IN (SELECT * FROM CLIENTE)
  LOOP
    FOR RE IN (SELECT NUMERO
               FROM ENDERECO
               WHERE ENDERECO.CLIENTE_ID=RC.CLIENTE_ID)
    LOOP
       -- FAZ O QUE DE FAZER
    END LOOP;    
  END LOOP;
END;

Funcinou do geito que você sugeriu acima porém tenho uma dúvida por que usando cursor no segundo loop ele duplica loop ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não teria de analisar o código , uso o for pois é mais simples, mas requer cuidados para tabelas muito grandes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.