Artigo do tipo Tutorial
Recursos especiais neste artigo:
Contém nota Quickupdate.
Use Funções Nativas do Oracle Aplicadas no Delphi
É muito comum utilizarmos o “like” quando precisamos realizar uma busca para resgatar dados, porém, o uso do mesmo nem sempre atende as necessidades, pois não levam em consideração possíveis erros de entrada de dados, ou seja, “erros humanos”. Neste artigo abordaremos com exemplos práticos e teóricos como utilizar a função nativa do Oracle chamada JARO_WINKLER_SIMILARITY e saber mais detalhes sobre o pacote UTL_MATCH e suas funções, aplicando posteriormente estes conhecimentos no Delphi.


Em que situação o tema é útil
Quando for necessário efetuar uma pesquisa textual, seja essa por um possível campo “Nome” ou qualquer outro que aceite texto livre, que requer um resultado não exato, ou seja, que deva retornar valores similares ao informado para a busca.

Hoje em dia o nível de complexidade das informações armazenadas no SGBD é cada vez maior, havendo assim uma necessidade crescente em encontrar novos meios de consulta. Um dos mais empregados atualmente, principalmente em projetos para web, são as buscas por similaridade. A necessidade em encontrar novos meios de consulta se deve à grande quantidade de inconsistências causadas por erros ortográficos, abreviações, caracteres trocados, siglas entre outros. Isto faz com que um mesmo objeto seja representado de várias formas, o que dificulta a busca deste pelos meios tradicionais.

Utilizando esta técnica de maneira apropriada é possível obter resultados satisfatórios, mesmo tendo pouco ou nenhum conhecimento do conteúdo armazenado. É comum a ocorrência de dados inconsistentes principalmente quando o mesmo é digitado ou quando o sistema é integrado, seja este representado como um endereço salvo com abreviações e erros ortográficos ou quando se quer resgatar dados do SGBD. Nestes casos um operador tradicional de busca não consegue recuperar os dados devido à variação existente, já que o mesmo utiliza a comparação por igualdade. Logo este problema não fica restrito somente a endereços, mas também aos mais variados casos.

Por exemplo, numa consulta para localizar um endereço cadastrado como “Avenida Presidente Vargas”. O mesmo pode conter diversas variações como “Av. Presidente Vargas” ou “Av. Pres. Vargas”, note que todas as variações se referem ao mesmo elemento. Numa consulta tradicional se utilizássemos qualquer destas variações o endereço retornaria vazio.

Temos também vários exemplos na web de sites que utilizam o conceito de busca por similaridade. O Google é um exemplo. Basta reparar que quando é digitado algum termo, mesmo que errado, automaticamente é exibida uma sugestão para o termo, onde muitas vezes é o termo escrito de forma correta e corrigida. Além do Google temos vários outros exemplos na web. Como buscas realizadas em sites de vendas para localizar algum produto. Podemos aplicar este conceito de busca no Delphi, tornando assim as consultas mais “inteligentes”, servindo assim como um diferencial na aplicação e facilitador para o usuário. Nesse artigo utilizamos um recurso nativo do Oracle, o pacote UTL_MATCH.

Já com o operador “like”, podemoscompararcadeias de caracteres utilizando padrões de comparação(SQL WildCard) para um ou mais caracteres, contudo, a pesquisa fica restrita a digitação correta.

Nota: WildCard é um operador coringa, que utiliza padrões de comparação usados no SQL para realizar uma busca seletiva. Este é representado por caracteres como: “%” (substitui nenhum ou mais caracteres), “_” (substitui um caractere).

Esse pacote foi introduzido no Oracle 10g Release 2, mas como foi documentado posteriormente, é dito que foi oficialmente suportado somente no Oracle 11g Release 2. Contém uma variedade de funções que são úteis para testar o nível de semelhança/diferença entre cadeias de texto.

Abordamos um pouco sobre cada uma dessas funções, dando mais ênfase à função JARO_WINKLER_SIMILARITY e sua implementação no Delphi.

Introdução ao pacote UTL_MATCH

Neste pacote há quatro funções que utilizam métodos diferentes para comparar a cadeia de caracteres de origem e destino. Estes retornam uma avaliação do que seria necessário para transformar este determinado conteúdo de origem em destino. As funções são separadas em duas categorias, EDIT_DISTANCE e JARO_WINKLER, que possuem diferentes algoritmos de análise (Nota do DevMan 1).

Nota do DevMan 1

Em 1965 um cientista russo chamado Vladimir Levenshtein, criou um algoritmo para calcular a distância ou semelhança entre duas cadeias de caracteres. O cálculo baseia-se na quantidade de operações de substituição, deleção e inserção necessárias para a cadeia de origem se transformar na cadeia de destino. O algoritmo é popularmente chamado de “distância de Levenshtein” em homenagem ao cientista russo criador do algoritmo ou também conhecido como “distância de edição” (EDIT_DISTANCE).

O algoritmo “JARO_WINKLER” é outra forma de calcular a semelhança entre duas cadeias de caracteres. Criado nos EUA para atender ao Censo, este estabelece uma métrica de distância entre duas cadeias, onde se calcula o número de caracteres comuns as duas strings e a semelhança da ordem em que se apresentam, sempre levando em conta possíveis erros humanos.

...

Quer ler esse conteúdo completo? Tenha acesso completo