Ordenação de Registros Filhos com Registros Pai.

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
joao.alberto.gt
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 18
Registrado em: Qui, 04 Set 2008 2:01 pm
Localização: Cravinhos - SP

Pessoal, beleza?

Tenho um processo de geração de arquivo txt baseado em informações da base de dados. Porém criei uma estrutura para que cada registro do arquivo txt seja gerado a partir de um objeto (procedure, function). Aí tenho o seguinte: gero todos os registros em ordem do próprio nome do registro (1, 2, A, C, enfim), ou seja, vai gerar todos os 1, todos os 2.. e assim por diante. Jogo tudo isso numa tabela, de forma desordenada, já que não sei, no momento da geração, quais serão os registros gerados, busco de uma tabela parametrizada. Até aí tudo bem, está funcionando. Depois que tenho essa tabela "suja", preciso ordenar de acordo com a estrutura hierárquica, exemplo:

reg. 1
reg. 2 (referente ao reg. 1)
reg. 1
reg. 2 (referente ao reg. 1)
reg. 3 (referente ao reg. 2)

enfim.. e aí segue...
eu tenho na tabela "suja" todos os registros 1 e os registros 2 e os registros 3 mas nenhuma referência entre eles... pensei em criar uma coluna pra armazenar o rowID do registro pai, porém isto me forçaria a sempre buscar a tabela pai ao gerar um registro filho, pra ter essa informação. Não sei se seria a melhor solução.

Alguém tem alguma idéia?

Abraços.
joaogarcia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 91
Registrado em: Ter, 20 Mar 2007 7:19 pm
Localização: Campinas - SP
Contato:
Cordialmente,
João C. Garcia

Você precisará do código pai na sua tabela e depois é só montar uma query hierárquica usando CONNECT BY PRIOR.
Neste link você encontra detalhes de como montar a query.

http://glufke.net/oracle/viewtopic.php?t=1908

T+
joao.alberto.gt
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 18
Registrado em: Qui, 04 Set 2008 2:01 pm
Localização: Cravinhos - SP

João, boa tarde. Utilizei o exemplo que você me passou e funcionou, porém gerou um problema:

Quando tenho vários registros-pai, o select duplicou os filhos para todos os pais, sabe me dizer o porque? não consegui encontrar um motivo.

Selecionar tudo

select lpad(' ', 5*level) || t.registro as registro, level, t.link_agrupa, t.nro_ordem_nivel
from   tabela_base t
start with t.registro = '0001'
connect by t.registro_pai = prior t.registro
order siblings by t.nro_ordem_nivel;
Isso gerou alguma coisa parecida com isso:

Selecionar tudo

registro_pai 200
...... registro 201
...... registro 201
...... registro 202
...... registro 202
registro_pai 200
...... registro 201
...... registro 201
...... registro 202
...... registro 202
quando era pra gerar:

Selecionar tudo

registro_pai 200
...... registro 201
...... registro 202
registro_pai 200
...... registro 201
...... registro 202
Sabe porque?

Abraços.[/list]
joaogarcia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 91
Registrado em: Ter, 20 Mar 2007 7:19 pm
Localização: Campinas - SP
Contato:
Cordialmente,
João C. Garcia

Aff... Não sei não... hehe
Mas aparentemente seu select está correto.
Talvez seja outra coisa hein...

Dá um desc na sua tabela e posta aí.

T+
joao.alberto.gt
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 18
Registrado em: Qui, 04 Set 2008 2:01 pm
Localização: Cravinhos - SP

Na verdade eu entendi o porque, seguinte:

os registros filhos que se repetiram têm o mesmo registro_pai, então quando o select busca os filhos daquele pai encontra todos, aí eu criei a coluna link_agrupa, que serviria (pelo menos na minha cabeça rsrs) para agrupar os registros iguais, ou seja, ele buscaria os filhos do registro pai desde que o link_agrupa dos filhos seja igual ao do pai.. mas não consegui fazer isso, entendeu?

Abraço.
joaogarcia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 91
Registrado em: Ter, 20 Mar 2007 7:19 pm
Localização: Campinas - SP
Contato:
Cordialmente,
João C. Garcia

Então, acho que entendi...
De qualquer forma, isso agora está sendo feito pelos campos registro e registro_pai, pk e fk respectivamente.
A query deveria ter retornado corretamente...

Abraço
joao.alberto.gt
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 18
Registrado em: Qui, 04 Set 2008 2:01 pm
Localização: Cravinhos - SP

Cara, consegui resolver. Criei mais um campo para utilizar com o connect by, então fiquei com uma hierarquia composta, ou seja:

1ª hierarquia
------------------
registro
registro_pai

2ª hierarquia
-----------------
rowid
rowid_pai

aí o código ficou assim:

Selecionar tudo

 start with t.registro = '0001'
connect by t.registro_pai = prior t.registro
       and t.link_agrupa_pai = prior t.link_agrupa
Funcionou!

Com essa estrutura, fiz alguns testes aqui, dá eu inserir ou retirar níveis pra quaisquer pais ou filhos sem mexer no código que gerará meus arquivos, ficou show!!!

Valeu pela ajuda. Abraços!
Responder
  • Informação