Corre esta query pra você ver como é que fica.

SELECT RPAD(’ ‘, LEVEL*4 -4 ) ||codigo
FROM tabela
CONNECT BY PRIOR codigopai = codigo
START WITH codigopai IS NOT NULL




________________________________
De: Roberto Souza Silva <rssp...@gmail.com>
Para: oracle_br@yahoogrupos.com.br
Enviadas: Quinta-feira, 6 de Agosto de 2009 16:50:03
Assunto: Re: [oracle_br] Função recursiva com CURSOR

  
Boa tarde a todos.
Elis, acabei resolvendo o problema implementando a maneira como eu estava
tratando o cursor.
Agora está funcionando perfeitamente.
Veja como ficou a implementação:

function Filhos(i integer) return varchar2 as
CURSOR crCodigos(p1 in integer) IS
SELECT codigo FROM tabela where codigopai=p1;
rr crCodigos%rowtype;
vs varchar2(1000) ;
vi integer;
begin
open crCodigos(i) ;
loop
fetch crCodigos into rr;
exit when (crCodigos%notfound );
if vs is null then
vs:=','||rr. codigo||Filhos( rr.codigo) ;
else
vs:=vs||','| |rr.codigo| |Filhos(rr. codigo);
end if;
end loop;
close crCodigos;
return vs;
end;

Não faço a mínima idéia do uso de connect by.
Seria possível você me dar um pequeno exemplo?

Muito obrigado pela atenção.

Abraços

Roberto

2009/8/6 Elis Azevedo Nery <elisn...@yahoo. com>

>
>
> Com connect by você não consegue resolver o seu problema?
>
> ____________ _________ _________ __
> De: Roberto Souza Silva <rssp...@gmail. com <rssprog%40gmail. com>>
> Para: oracle...@yahoogrup os.com.br <oracle_br%40yahoog rupos.com. br>
> Enviadas: Quarta-feira, 5 de Agosto de 2009 20:57:10
> Assunto: [oracle_br] Função recursiva com CURSOR
>
>
> Caros amigos, boa tarde.
>
> Estou tendo alguns problemas com recursividade.
> Vejam o código abaixo:
>
> CREATE OR REPLACE FUNCTION teste(piCodigo IN integer, piCodigoPai IN
> integer) RETURN VARCHAR2 AS
> vsResult VARCHAR2(4000) ;
> --
> FUNCTION Filhos(i INTEGER) RETURN VARCHAR2 AS
> vs VARCHAR2(1000) ;
> vi INTEGER;
> CURSOR crCodigos(p1 IN INTEGER) IS
> SELECT codigo FROM tabela WHERE codigopai=p1;
> BEGIN
> FOR x IN crCodigos(i) LOOP
> if vs is null then
> vs:=x.codigo| |','||Filhos( x.codigo) ;
> ELSE
> vs:=vs||','| |x.codigo| |','||Filhos( x.codigo) ;
> END IF;
> END LOOP;
> CLOSE crCodigos;
> RETURN vs;
> END;
> --
> BEGIN
> .
> .
> vsResult:=Filhos( piCodigo) ;
> .
> .
> RETURN vsResult;
> END teste3;
>
> Bem, não sei se deu para ficar claro, mas o que quero é correr uma tabela
> que tem uma FK para ela mesma.
> O problema com o código acima é o ORA-06511 (curso já está aberto).
> Tentei implementar TYPEs, mas me faltam conhecimentos para lidar com eles.
> Procurei na lista por "recursiva" e não encontrei nada a respeito.
> Logo não me restou alternativa, tenho que pedir ajuda dos universitários.
> ehhe
>
> Alguém feria a gentileza?
>
> Forte abraço a todos e obrigado.
>
> Roberto
>
> [As partes desta mensagem que não continham texto foram removidas]
>
> ____________ _________ _________ _________ _________ _________ _
> Veja quais são os assuntos do momento no Yahoo! +Buscados
> http://br.maisbusca dos.yahoo. com
>
> [As partes desta mensagem que não continham texto foram removidas]
>
> 
>

[As partes desta mensagem que não continham texto foram removidas]


   


      
____________________________________________________________________________________
Veja quais são os assuntos do momento no Yahoo! +Buscados
http://br.maisbuscados.yahoo.com

[As partes desta mensagem que não continham texto foram removidas]

Responder a