Problemas para compilar a função TIRAACENTO na base de dados

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Pessoal,

Estou tentando compilar a função TIRAACENTO disponível neste forum em uma base de dados 9.2.0.8 (UNIX solaris sparc 64 bits), mas estou encontrando uma certa dificuldade nesta atividade.

O código adaptado da função é o seguinte:

Selecionar tudo

create or replace function FC_TIRA_ACENTO
(pString in varchar2) return varchar2 is
--  Esta funcao foi retirada do forum GLUFKE.NET
vStringReturn varchar2(2000);
--
begin
  vStringReturn := translate( pString,
                    'Ññ'ÁÇÉÍÓÚÀÈÌÒÙÂÊÎÔÛÃÕËÜáçéíóúàèìòùâêîôûãõëü',
                    'NnACEIOUAEIOUAEIOUAOEUaceiouaeiouaeiouaoeu');
  --
  return vStringReturn;
  --
end FC_TIRA_ACENTO;
A função é compilada sem problemas na base, mas ao extrair a mesma, me deparo com o seguinte código:

Selecionar tudo

create or replace function FC_TIRA_ACENTO
(pString in varchar2) return varchar2 is
--  Esta funcao foi retirada do forum GLUFKE.NET
vStringReturn varchar2(2000);
--
begin
  vStringReturn := translate( pString,
                    '¥¤µ¿¿Öàé·ÔÞãë¶Ò×âêÇåÓ¿ ¿¿¡¢£¿¿¿¿¿¿¿¿¿¿Æä¿¿',
                    'NnACEIOUAEIOUAEIOUAOEUaceiouaeiouaeiouaoeu');
  --
  return vStringReturn;
  --
end FC_TIRA_ACENTO;
Creio que deve ser algo relacionado com o idioma, mas não conseguí encontrar uma forma de fazer a função ser compilada sem "corromper" os caracteres acentuados.

Aguém teria alguma sugestão de como contornar este problema?

Grato pela ajuda !

Sergio
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP
Ricardo H. Tajiri

Isso está parecendo problema com o NLS_LANG do client. Qual SO está o client e qual o valor o NLS_LANG que está sendo usado (no client mesmo)? Os dois devem ser compatíveis.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Burga,

Meu oracle client 9.2 está instalado em uma estação de trabalho Windows XP em idioma portugués.

Consultei o REGEDIT e verifiquei que NLS_LANG apresenta o valor "NA".

Abraços,

Coutinho
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP
Ricardo H. Tajiri

Dê uma olhada no NLS_LANG deste local:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEx\

Você deve ter visto no HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE.

Veja se está com esse:
BRAZILIAN PORTUGUESE_BRAZIL.WE8MSWIN1252

Se não tiver, mude e faça um teste. :D
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Burga (Ricardo),

Constatei que o NLS_LANG já se encontra como BRAZILIAN PORTUGUESE_BRAZIL.WE8MSWIN1252.

Fiz o teste com o meu sqlplus. Perceba no comando TO_CHAR que o idioma está mesmo setado para o português:

Selecionar tudo


SQL> SELECT TO_CHAR(SYSDATE,'MONTH') FROM DUAL;

TO_CHAR(S
---------
JULHO

SQL> create or replace function FC_TIRA_ACENTO
  2  (pString in varchar2) return varchar2 is
  3  --  Esta funcao foi retirada do forum GLUFKE.NET
  4  vStringReturn varchar2(2000);
  5  --
  6  begin
  7    vStringReturn := translate( pString,
  8                      'ÑñÁÇÉÍÓÚÀÈÌÒÙÂÊÎÔÛÃÕËÜáçéíóúàèìòùâêîôûãõëü',
  9                      'NnACEIOUAEIOUAEIOUAOEUaceiouaeiouaeiouaoeu');
 10    --
 11    return vStringReturn;
 12    --
 13  end FC_TIRA_ACENTO;
 14  /

FunþÒo criada.

SQL> SELECT TEXT FROM USER_SOURCE WHERE NAME = 'FC_TIRA_ACENTO';

TEXT
--------------------------------------------------------------------------------
function FC_TIRA_ACENTO
(pString in varchar2) return varchar2 is
--  Esta funcao foi retirada do forum GLUFKE.NET
vStringReturn varchar2(2000);
--
begin
  vStringReturn := translate( pString,
                    'ÑñÁ┐ÉÍÓÚÀÈÌÒÙÂÊÎÔÛÃÕË┐á┐┐íóú┐┐ì┐┐┐┐┐┐┐ãõ┐ü',
                    'NnACEIOUAEIOUAEIOUAOEUaceiouaeiouaeiouaoeu');
  --
  return vStringReturn;

TEXT
--------------------------------------------------------------------------------
  --
end FC_TIRA_ACENTO;

13 linhas selecionadas.
Talvez o problema resida no banco de dados do servidor UNIX. O NLS_LANG de lá está AMERICAN, mas eu não posso mudar esta definição.

Atenciosamente,

Sergio
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Ufa,

Acho que finalmente eu encontrei a causa do problema.

Percebo que consigo compilar sem problemas a função quando uso o sqlplus do servidor de banco de dados (NLS_LANGUAGE=AMERICAN).

O mesmo não ocorre se tento compilar a mesma através do meu oracle client (NLS_LANGUAGE=BRAZILIAN.PORTUGUESE).

Creio que quando o idioma co cliente não é o mesmo do banco de dados, deve ocorrer alguma espécie de conversão automática.

Seja como for, o problema está resolvido.

Obrigado pela ajuda,

Sergio Coutinho
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP
Ricardo H. Tajiri

Existe sim uma conversão de caracteres para diferentes NLS_LANGs de client x server. Mas o Oracle deveria dar conta dessa conversão sem problemas.

O que eu achei que estivesse ocorrendo é que a máquina cliente (SO) e o NLS do client não estivessem correspondendo um com o outro. Neste caso também dá problemas na conversão.

Eu ia falar pra você fazer o teste compilando direto no servidor, assim não teria a conversão, mas que bom que você já pensou nisso... :D
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 7 visitantes