Primeira letra maiúscula (Title Case) no Firebird

Em muitos sistemas, é comum precisarmos padronizar textos gravados no banco de dados, especialmente descrições e nomes que chegam em letras maiúsculas ou minúsculas.
Se você utiliza Firebird 5, é possível resolver isso diretamente no banco, criando uma função interna capaz de converter qualquer texto para o formato Title Case — ou seja, com a primeira letra de cada palavra em maiúsculo e as demais em minúsculo.
O desafio
O Firebird possui funções como UPPER() e LOWER(), mas nenhuma função nativa que aplique a capitalização de cada palavra.
Por exemplo, não há algo como INITCAP() (presente em bancos como Oracle e PostgreSQL).
Por isso, precisamos criar nossa própria função interna PSQL, que percorre cada caractere da string, identifica o início de uma nova palavra e aplica UPPER() ou LOWER() conforme o caso.
Criando a função INITCAP_UTF8
A seguir está uma função compatível com Firebird 5, que trata inclusive acentos e caracteres especiais.
Ela transforma qualquer texto em formato de título, preservando a legibilidade e o padrão de escrita:
CREATE OR ALTER FUNCTION INITCAP_UTF8(TEXTO VARCHAR(255) CHARACTER SET UTF8)
RETURNS VARCHAR(255) CHARACTER SET UTF8
AS
DECLARE VARIABLE I INT;
DECLARE VARIABLE TAM INT;
DECLARE VARIABLE C CHAR(1) CHARACTER SET UTF8;
DECLARE VARIABLE RESULTADO VARCHAR(255) CHARACTER SET UTF8;
DECLARE VARIABLE PROX_MAIUSC BOOLEAN;
BEGIN
TEXTO = TRIM(TEXTO);
RESULTADO = '';
PROX_MAIUSC = TRUE;
TAM = CHAR_LENGTH(TEXTO);
I = 1;
WHILE (I <= TAM) DO
BEGIN
C = SUBSTRING(TEXTO FROM I FOR 1);
-- Se for letra (inclusive acentuadas)
IF (PROX_MAIUSC AND C SIMILAR TO '[A-Za-zÁÉÍÓÚÀÈÌÒÙÂÊÎÔÛÃÕÇáéíóúàèìòùâêîôûãõç]') THEN
RESULTADO = RESULTADO || UPPER(C);
ELSE
RESULTADO = RESULTADO || LOWER(C);
-- Verifica se o próximo caractere inicia nova palavra
IF (C IN (' ', '.', ',', ';', ':', '!', '?', '(', ')', '-', '''', '"')) THEN
PROX_MAIUSC = TRUE;
ELSE
PROX_MAIUSC = FALSE;
I = I + 1;
END
RETURN RESULTADO;
END;
Aplicando a função no seu banco
Após criar a função, você pode usá-la em qualquer comando SQL.
Por exemplo, para atualizar todos os registros de um campo:
UPDATE produto s SET s.descricao = INITCAP_UTF8(s.descricao) WHERE s.tipo_item = 'P';
Esse comando deixará o campo descricao com o formato adequado, tornando o conteúdo mais padronizado e agradável para o usuário.
Exemplos práticos
| Texto original | Resultado formatado |
|---|---|
CANETA AZUL |
Caneta Azul |
lápis DE COR |
Lápis De Cor |
BORRACHA BRANCA |
Borracha Branca |
CAIXA D’ÁGUA |
Caixa D’Água |
papel-cartão |
Papel-Cartão |
Por que usar funções internas no Firebird?
Nas versões mais recentes do Firebird 5, as funções SQL internas (PSQL-based) se tornaram uma ferramenta poderosa.
Elas substituem as antigas UDFs externas, permitem melhor portabilidade do banco e garantem maior segurança, já que todo o processamento é feito dentro do engine, sem depender de bibliotecas externas em C.
Além disso, funções como essa tornam a manutenção de dados muito mais simples, evitando a necessidade de scripts de pós-processamento em aplicações Delphi, .NET ou outras linguagens.
Outras versões
💡 Vale destacar que as Internal Functions estão disponíveis a partir do Firebird 3, o que permite integrar funções como esta diretamente ao banco.
Para quem utiliza versões anteriores, é possível adaptar a lógica criando uma Stored Procedure que percorre o texto caractere por caractere, aplicando a mesma regra de capitalização. Assim, a funcionalidade continua acessível mesmo em ambientes legados.
Conclusão
Com poucas linhas de código, é possível deixar seu banco de dados Firebird mais inteligente e padronizado.
A função INITCAP_UTF8 é um ótimo exemplo de como aproveitar os recursos do Firebird 5 para lidar melhor com strings em UTF-8, mantendo a integridade e a estética dos dados.
💡 Dica: se quiser deixar a função ainda mais refinada, é possível ignorar palavras curtas como “de”, “da”, “em”, aplicando capitalização apenas quando fizer sentido em títulos.
💬 E você?
Já precisou padronizar textos diretamente no banco de dados?
Compartilhe sua experiência ou dúvida nos comentários! 🔧💭
#Firebird #SQL #BancoDeDados
#Desenvolvimento
#GiovaniDaCruz