Mais um blog inútil.

Outubro 2, 2013

Arvorezinha 2.0 em Oracle SQL

Filed under: Arvorezinha,Coding,Uncategorized — neofreak @ 16:54

Ora viva amiguinhos! Antes de mais gostava de vos saudar e agradecer por me acolherem no melhor blog inútil do mundo. Sinto-me como um ilustre convidado com as maiores honrarias, e planeio contribuir com mais postas de programação inútil (logo que seja natural e espontânea).

A minha primeira contribuição é para o projecto árvorezinha. Tenho para vós uma árvorezinha que respeita o RFC 2.0 (já existia uma 1.0) feita em Oracle SQL.

select * from (
 select 'a'||lpad(level, 5,'0') as linha,
  rpad(' ', &altura-level, ' ') || rpad('*', 2*level-1, '*') as arvorezinha
 from dual
 connect by level <= &altura
 union
 select 't'||lpad(level, 5,'0') as linha,
  rpad(' ', ((2*&altura-1)/4)+1, ' ')||rpad('#', (2*&altura-1)/2, '#')
 from dual
 where mod(&altura, 2) = 0
 connect by level <= (&altura/2)
 union
 select 't'||lpad(level, 5,'0') as linha,
  rpad(' ', ((2*&altura-1)/4), ' ')||rpad('#', (2*&altura-1)/2+1, '#')
 from dual
 where mod(&altura, 2) > 0
 connect by level <= (&altura/2)
) order by linha asc;

A implementação usa 3 queries: uma para desenhar o topo (*), e duas para desenhar o tronco (#) nos casos de termos uma arvorezinha de altura par e de altura ímpar.  Utiliza-se a função rpad para criar uma string com caracteres repetidos e foi só implementar as fórmulas presentes no programa-RFC no argumento length do rpad e na clausula connect by.

Para garantir a ordenação das linhas, criei uma segunda coluna 'linha'.

Aqui estão os magníficos resultados:

Infelizmente, não é compatível com MySQL porque a melhor base de dados livre não suporta a clausula connect by level :(

Comentar

widgeon
widgeon
widgeon
widgeon