Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

vivi.globo

Indice

Recommended Posts

Olá...

 

 

Bom dia!!!!

 

Gostaria de uma outra ajuda...

 

Bom estou fazendo um indice para alguns a campos que me foi solicitada .

 

Solicitação:

 

Estou precisando da criação de índices nos

campos texto descritos abaixo para implementação de listagem em ordem alfabética com paginação.

Esse índice precisa ter as seguintes características:

índice por ordem alfabética, podendo ser maiúscula ou minúscula e contendo acento ou não.

 

Bom fiz da maneira mais simples..mas está faltando algumas relações que estão de vermelho acima

 

CREATE INDEX ID_GLB_ENT_CANAL_1 ON TB_GLB_ENT_CANAL (NOME_TXT);

 

 

Poderiam me ajudar???

 

Bjs!!! :rolleyes:

Compartilhar este post


Link para o post
Compartilhar em outros sites

você pode criar indice com base em funcoes

substr , upper, lower etc

 

acho que isto funciona

CREATE INDEX ID_GLB_ENT_CANAL_1 ON TB_GLB_ENT_CANAL (UPPER(NOME_TXT));

 

PARA O CASO DE ACENTOS , você PODE USAR UMA FUNCTION QUE REMOVA OS ACENTOS

 

CREATE OR REPLACE FUNCTION REMOVE_ACENTOS (pValue IN VARCHAR2)
  RETURN  VARCHAR2 IS
-- Remove Acentos de uma string
ComAcento VARCHAR2(35);
SemAcento VARCHAR2(35);
Saida	 VARCHAR2(2000);
BEGIN
	ComAcento := 'àâêôûãõáéíóúçüñÀÂÊÔÛÃÕÁÉÍÓÚÇÜÑ.';
	SemAcento := 'aaeouaoaeioucunAAEOUAOAEIOUCUN ';
	Saida := '';
	If Length(pValue) > 0 then
	  For x in 1..Length(pValue)
	  Loop
		if Instr(ComAcento,Substr(pValue,x,1)) > 0 then
		  Saida := Saida || Substr(SemAcento,(Instr(ComAcento,Substr(pValue,x,1))),1);
		else
		  Saida := Saida || Substr(pValue,x,1);
		end if;
	  End Loop;
	End If;
	RETURN Saida;
END; -- Function REMOVE_ACENTO
/

 

CREATE INDEX ID_GLB_ENT_CANAL_1 ON TB_GLB_ENT_CANAL (REMOVE_ACENTOS(UPPER(NOME_TXT)));

 

NÃO SEI SE A FUNÇÃO DE USUARIO PODE TER INDICE, SÓ TESTANDO,

NÃO FAÇO IDEIA TB DA PERFORMANCE DISTO, NUNCA USEI.

 

NESTE CASO A BUSCA TERIA DE SER MAIUSCULA E SEM ACENTO (NO PARAMETRO)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Perfeito Motta!!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Porém, tome cuidado que muitos índices na tabela podem trazer sérios problemas de performance nas consultas, e fora as instruções de INSERT, DELETE e UPDATE.

 

E você pode criar os índices como o Motta disse:

 

-- INDICE POR FUNÇÃO | Maiúscula SQL > CREATE INDEX IDX_RA_01 ON TAB_RODRIGO (upper(nome)); Index Created. -- INDICE POR FUNÇÃO | Minúscula SQL > CREATE INDEX IDX_RA_02 ON TAB_RODRIGO (lower(nome)); Index Createad.  -- INDICE ORDERNADO SQL > CREATE INDEX IDX_RA_03 ON TAB_RODRIGO (a ASC); Index Created. SQL > CREATE INDEX IDX_RA_04 ON TAB_RODRIGO (a DESC);

E usar com a Função que o motta passou.

 

Abraços, http://forum.imasters.com.br/public/style_emoticons/default/blush.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

 

Os índices baseados em função podem ter sim funções de usuários, no caso, o REMOVE_ACENTOS, porém, caso tente executar como está acima ele irá dar ERRO, falando que não é uma função deterministic.

 

Para funcionar terá que alterar o retorno da FUNÇÃO do seu bloco SQL acresentando deterministic no final.

 

De:

 

RETURN VARCHAR2

 

Para:

 

RETURN VARCHAR2 DETERMINISTIC

 

Veja um exemplo prático:

 

SQL > CREATE OR REPLACE FUNCTION REMOVE_ACENTOS (pValue IN VARCHAR2)  2	RETURN  VARCHAR2 IS  3  -- Remove Acentos de uma string  4  ComAcento VARCHAR2(35);  5  SemAcento VARCHAR2(35);  6  Saida	 VARCHAR2(2000);  7  BEGIN  8	  ComAcento := 'àâêôûãõáéíóúçüñÀÂÊÔÛÃÕÁÉÍÓÚÇÜÑ.';  9	  SemAcento := 'aaeouaoaeioucunAAEOUAOAEIOUCUN '; 10	  Saida := ''; 11	  If Length(pValue) > 0 then 12		For x in 1..Length(pValue) 13		Loop 14		  if Instr(ComAcento,Substr(pValue,x,1)) > 0 then 15			Saida := Saida || Substr(SemAcento,(Instr(ComAcento,Substr(pValue,x,1))),1); 16		  else 17			Saida := Saida || Substr(pValue,x,1); 18		  end if; 19		End Loop;  20	 End If; 21	  RETURN Saida; 22  END; -- Function REMOVE_ACENTO 23  /Function created.SQL > create index IDX_RA_05 on x (REMOVE_ACENTOS(a));create index IDX_RA_05 on x (REMOVE_ACENTOS(a))							 *ERROR at line 1:ORA-30553: The function is not deterministic...SQL > l 2  2*   RETURN  VARCHAR2 ISSQL > c/VARCHAR2/VARCHAR2 DETERMINISTIC/  2*   RETURN  VARCHAR2 DETERMINISTIC ISSQL > l  1  CREATE OR REPLACE FUNCTION REMOVE_ACENTOS (pValue IN VARCHAR2)  2	RETURN  VARCHAR2 DETERMINISTIC IS  3  -- Remove Acentos de uma string  4  ComAcento VARCHAR2(35);  5  SemAcento VARCHAR2(35);  6  Saida	 VARCHAR2(2000);  7  BEGIN  8	  ComAcento := 'àâêôûãõáéíóúçüñÀÂÊÔÛÃÕÁÉÍÓÚÇÜÑ.';  9	  SemAcento := 'aaeouaoaeioucunAAEOUAOAEIOUCUN '; 10	  Saida := ''; 11	  If Length(pValue) > 0 then 12		For x in 1..Length(pValue) 13		Loop 14		  if Instr(ComAcento,Substr(pValue,x,1)) > 0 then 15			Saida := Saida || Substr(SemAcento,(Instr(ComAcento,Substr(pValue,x,1))),1); 16		  else 17			Saida := Saida || Substr(pValue,x,1); 18		  end if; 19		End Loop; 20	  End If; 21	  RETURN Saida; 22* END; -- Function REMOVE_ACENTOlSQL > /SQL > create index idx_ra_06 on x (REMOVE_ACENTOS(a));Index created.SQL >
Agora Performance, isso será problematico mesmo, pois para cada linha será executado a FUNÇÃO.

 

É igual utilizar milhares de índice numa tabela, as vezes será melhor fazer um FULL SCAN que ter 5 ou 6 índices pendurados na tabela.

 

Abraços, http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.