cadmiel 0 Denunciar post Postado Março 29, 2015 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
Motta 645 Denunciar post Postado Março 29, 2015 Vc precisa de 2 for For para clientes ____For para enderecos Compartilhar este post Link para o post Compartilhar em outros sites
cadmiel 0 Denunciar post Postado Março 30, 2015 @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
Motta 645 Denunciar post Postado Março 30, 2015 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
cadmiel 0 Denunciar post Postado Março 31, 2015 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
Motta 645 Denunciar post Postado Março 31, 2015 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