Boa noite Chiappa. Me desculpe, no momento de pedir ajuda acabei deixando itens importantes sem descrever. Estou me conectando a um banco oracle 11g na release 11.2.0.4 se não me engano, a aplicação é feita em delphi, a mesma tem apenas um user, e os usuários do sistema são geridos em uma tabela neste usuário.
A empresa esta entrando em recesso vou testar as suas sugestões. Infelizmente não dispomos de um DBA, por isso de estar aqui pedindo ajuda. Agradeço a sua disposição. att, Daniel Em 14 de dezembro de 2016 11:02, [email protected] [oracle_br] < [email protected]> escreveu: > > > Seguinte : vc tem diversas possibilidades pra isso - como vc não diz a > Versão nem a Edição do seu RDBMS Oracle, nem diz se usa sessões isoladas ou > algum tipo de pool de conexão pra se conectar no banco, e Também não diz se > cada usuário da aplicação cria a sua sessão particular com o seu usuário no > banco Oracle , não podemos dizer qual dessas soluções abaixo seria > aplicável.... > Estou (já que vc NÂO NOS INFORMA) aqui SUPONDO que a sua aplicação tem os > SQLs escritos no código-fonte, e que através de algum comando da > linguagem/tool de desenvolvimento a aplicação se conecta no banco , esses > SQLs são enviados pro banco e os resultsets são processados na aplicação... > > Isso posto, de modo geral seriam as soluções : > > a. SE for viável em termos de Armazenamento/gasto de espaço em disco, vc > pode ter uma coluna que ESPELHA o conteúdo da coluna NM_ENTIDADE mas > tirando acentos, depois a Aplicação faz a consulta nessa coluna-espelho MAS > exibe a coluna 'real' : no banco 11g em diante isso seria Automático usando > o recurso da VIRTUAL COLUMN, em versões mais antigas a Aplicação teria que > manter isso OU vc teria que ter uma trigger > > b. SE cada usuário tem a sua sessão dedicada no banco, E os outros SQLs > que vão ser executados nessa sessão podem também trabalhar com comparações > sem acentuação, vc pode Ajustar alguns parâmetros de sessão para que o > Oracle faça comparações e ordenações desprezando acentos : seriam comandos > tipo ALTER SESSION SET NLS_COMP=LINGUISTIC; e ALTER SESSION SET > NLS_SORT=BINARY_xx; , one esse xx pode ser CI (Case-Insensitive, também > ignora maiusc/minusc) ou pode não estar presente (só BYNARY) aí respeita > minusc/maiusc, entre outras opções - CONSULTE A DOCUMENTAÇÂO DA SUA VERSÃO, > isso pode mudar de acordo com a versão em uso... > Isso pode ser feito dentro da aplicação (basta a aplicação mandar o > comando ALTER SESSION desejado pro banco - isso é SQL (veja que o comando > ALTER é **** SIM **** um comando SQL, até por isso está DOCUMENTADO NO > MANUAL ORACLE DE SQL!!), então da mesma maneira que a sua linguagem/tool de > programação pe capaz de enviar SELECTs pro banco ela DEVE SER CAPAZ de > enviar ALTER SESSION), ou ENTÃO isso pode ser feito automaticamente pelo > RDBMS Oracle quando a sessão é criada (veja o item LOGON TRIGGER na doc > Oracle). > > Uma ** VARIAÇÃO ** da técnica, para 'isolar' o setting de ignorar acentos > pra uma query, é vc (NO CÓDIGO-FONTE da sua aplicação!) alterar > imediatamente antes da sua query o ALTER, executar a query e depois voltar > o ALTER para o valor que estava antes.... > > c. a sua idéia de ter uma função que troca os caracteres acentuados é > possível sim também : a TRANSLATE funciona, é possível também usar outras > funções built-in do RDBMS Oracle, e tais funções podem ser encapsuladas > numa FUNCTION sua ou escritas diretamente no SQL da aplicação, sim.... > > > ==> Porém, temos as questões de performance, SE o volume de dados a > pesquisar será considerável : pra começo de conversa, se vc tem um índice > criado com o valor "normal" da coluna X, OBVIAMENTE é isso que está > armazenado no índice, se vc altera esse conteúdo com uma função qualquer > LOGICAMENTE o índice não tem mais os mesmos valores então via de regra NÂO > será Usado..... Pra solucionar isso, vc pode criar um índice que indexe a > mesma exata função que vc vai usar na pesquisa, veja na doc Oracle sobre > FUNCTION BASED INDEX... > Outro ponto é que vc usa % no começo e no fim, isso via de regra ** > IMPEDE ** a utilização plena de um índice comum, pois o %valor% indica que > o valor pode estar em QUALQUER posição do índive, aí o RDBMS teria que > varrer o índice INTEIRINHO.... SE vc tiver isso instalado e disponível no > seu RDBMS Oracle , normalmente é muito mais performático para esse tipo de > pesquisa um índice do tipo TEXT, que é pensado/criado para pesquisas > incompletas..... Veja na doc as refs, E consulte com seu DBA se vc tem o > recurso disponível.... > > []s > > Chiappa > >
