ROWNUM do Oracle

Dica rápida: ao contrário do que muita gente imagina, a cláusula rownum do oracle - geralmente utilizada para limitar a quantidade de registros que uma query pode trazer - não funciona corretamente caso você considere a hipótese de que o atributo ROWNUM é uma propriedade da tabela.

Para ficar mais fácil o entendimento, imagine a seguinte query:

select * from where ROWNUM > 1;

Caso você execute essa query, verá que registro nenhum será trazido; isso porque, a pseudo coluna ROWNUM somente passa a existir, depois do resultSet retornar do banco; neste caso, se a a intenção é limitar os itens de um determinado select, considerando algum tipo de ordenação a forma correta do select acima seria, no caso de limitar os resultados em apenas 5 itens seria este:

select *from (select * from order by sal desc) where ROWNUM <= 5;

Como se pode ver, primeiro é necessário trazer os registro do banco (obter o resultsSet), para que depois disso, se possa limitar a quantidade de linhas, através do ROWNUM.

Uma ótima documentação para aprofundar o entendimento desse e de outros tipos de abordagens do ROWNUM, você pode conferir em: http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html

CFDOCUMENT e o erro "The document has no pages."

O Adobe ColdFusion a partir da versão 7, passou a ter a capacidade de gerar documentos PDF e FlashPaper de maneira "on the fly", tornando uma tarefa que antigamente era trabalhosa e chata (alguém lembra da custom CF_PDF? argh?!..) em algo simples na hora de gerar tais documentos.

A tal facilidade passou a ser um problema dia desses, quando implementei em um dos meus clientes a função de geração em formato PDF de documentos, para padronizar a impressão; pois bem, ocorre que por motivos de log dos arquivos que eram gerados, ficou definido que os mesmos, seriam salvos fisicamente no servidor, para que posteriormente fossem anexados e enviados por email; a intenção de salvar localmente os arquivos era tão somente por conta do envio desse log por e-mail; tanto, que na configuração da geração do arquivo .pdf, defini um valor padrão para o nome do arquivo, que seria substituído em request futuros, caso o arquivo já existisse.
O mecanismo até que funcionou perfeitamente por alguns dias, até que outros usuários, começaram à fazer uso da função, causando repentinamente em horários de pico de uso do sistema, uma lentidão considerável do application server e um erro estranho na tentativa de geração do documento:

ExceptionConverter: java.io.IOException: The document has no pages. at com.lowagie.text.pdf.PdfPages.writePageTree(Unknown Source) at com.lowagie.text.pdf.PdfWriter.close(Unknown Source) at com.lowagie.text.pdf.PdfDocument.close(Unknown Source) at com.lowagie.text.Document.close(Unknown Source) at coldfusion.tagext.lang.DocumentTag.doAfterBody(DocumentTag.java:1225)(...)

Depois de tanto alterar código, pensado que fosse algo ligado à performance da geração, ou até algum possível bug, com uma suposição com relação à escrita de arquivos em disco rígido, a primeira linha (ExceptionConverter: java.io.IOException: The document has no pages.) foi matadora para diagnoticar o que estava acontecendo: a condição de gravar o arquivo de log, sempre gerava o mesmo nome para o dito cujo: algo parecido com xyz.pdf. E era exatamente essa a condição errônea: deixar que dois usuários pudessem gerar um arquivo pdf com o mesmo nome em um mesmo diretório: erros de io geralmente são derivados de situações de escrita ou leitura, e permitindo que usuários tivessem acesso à essa geração sem qualquer tipo de controle, fazia com que o erro fosse lançado (o mecanismo de geração do PDF, simplesmente não conseguia criar dois documentos de forma simultânea), e deixasse o app server lento (enquanto o request, não era abortado, o CF aguardava a liberação de escrita).

A dica para resolver o problema ficou por conta de alterar a condição de nomeação dos arquivos para impedir esses tipos de acessos inválidos;

Entretanto, a mensagem "The document has no pages." possui uma outra causa, por conta de problemas na resolução de DNS quando se referencia arquivos externos no documento tais como imagens, etc. Encontrei durante minha pesquisa para solução do problema, um post que comenta em detalhes o motivo e a solução para este outro problema.

CFC para cálculo geodésico

Terminei recentemente a implementação de um componente em ColdFusion para calcular a distância entre dois pontos, dados a latitude a longitude de ambos; para evitar que você passe pelo caminho das pedras para encontrar o cálculo, segue o fonte para downlod...

Desde já críticas e sugestões de novas implementações são bem vindas!

Enjoy!

Artigos e dicas de CF

Para quem se lembra dos vários outros blogs por onde já passei, cheguei à escrever alguns artigos em forma de tutorial para o pessoal novo que está chegando, ou que por algum motivo tem curiosidades de conhecer alguns meandros do Adobe ColdFusion, enquanto application server.

Fiz uma coleção desses artigos em uma sessão específica no site da VIBE, só para isso; para galera que já leu, vale como consulta/referência e para os novatos, vale a pena a leitura.

de volta, galera!!!!

Faaaaaaaaaaaaaaaaaaaaaala galera!
Pela vigésima oitava vez, aqui estou retornando ao mundinho da blogsfera para compartilhar minhas revoltas, descobertas e dúvidas com vocês; após uma longa pausa, aos poucos as coisas estão voltando à normalidade da não frenética correria.

Tão logo termine de organizar as coisas, volto à trocar idéia com vocês.