Bom pessoal, a função abaixo remover caracteres especiais em textos no Oracle, facilitando o tratamento de dados do tipo texto, auxiliando em consultas e criação de índices.
CREATE OR REPLACE FUNCTION NORMALIZAR(str_in VARCHAR2) RETURN VARCHAR2 IS
pos NUMBER(10);
chars_special VARCHAR2(255);
chars_normal VARCHAR2(255);
str VARCHAR2(255) := UPPER(str_in);
BEGIN
chars_special := 'ÁÀÃÂÉÊÍÓÔÕÚÜÇ.-';
chars_normal := 'AAAAEEIOOOUUC ';
str := TRIM(upper(str));
pos := length(chars_normal);
WHILE pos > 0
LOOP
str := REPLACE(str,
substr(chars_special, pos, 1),
substr(chars_normal, pos, 1));
pos := pos - 1;
END LOOP;
str := TRIM(str);
WHILE regexp_like(str, ' {2,}')
LOOP
str := REPLACE(str, ' ', ' ');
END LOOP;
pos := length(str);
WHILE pos > 0
LOOP
IF regexp_like(substr(str, pos, 1), '[^A-Z0-9Ç@._ +-]+')
THEN
str := concat(substr(str, 1, pos - 1), substr(str, pos + 1));
END IF;
pos := pos - 1;
END LOOP;
RETURN str;
END;
/
melhor função
ResponderExcluirfunction fun_retiraCharEspecial(pString in varchar2) return varchar2 is
vTextoAux varchar2(2000);
vResult varchar2(2000);
begin
vTextoAux := translate(pString,
'ÁÇÉÍÓÚÀÈÌÒÙÂÊÎÔÛÃÕËÜáçéíóúàèìòùâêîôûãõëü',
'ACEIOUAEIOUAEIOUAOEUaceiouaeiouaeiouaoeu');
begin
select translate(vTextoAux, '¾½¼»º¹¸·¶µ´³²±°¯®¬«ª©¨§¦¥ÏÎÍÌËÊÉÈÇÆßÒ8<.ÑÐ/-.,^?:;¿', ' ') into vResult from dual;
exception
when no_Data_found then
vResult := vTextoAux;
when others then
vResult := vTextoAux;
end;
return trim(replace(replace(replace(vResult, chr(10), ''), chr(13), ''), chr(9), ''));
return vResult;
end fun_retiraCharEspecial;