Arvorezinha 2.0 em Oracle SQL
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 :(