Translate convertendo caracteres com til (~)

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
rtadeum
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qua, 28 Mar 2012 3:15 pm

Primeiramente, um ótimo natal a todos!
Pessoal, estou com um problema no translate para converter caracters com til(~)
Quando eu tento converter por exemplo:

Selecionar tudo

select translate( 'ã',  'õÕãÃ','oOaA') from dual
está retornado (o) ao invés de (a) e também não respeita upper ou lower . O fato é que ele esta buscando a primeira ocorrência que estiver no parametro ex:

Selecionar tudo

select translate( 'Ã',  'õÕãÃ','oOaA') from dual -- retorna o
select translate( 'Ã',  'ÕõãÃ','OoaA') from dual -- retorna O
select translate( 'Ã',  'ãÃÕõ','aAOo') from dual -- retorna a
select translate( 'Ã',  'ÃãÕõ','AaOo') from dual -- retorna A 

Alguém poderia dar um help?
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 318
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Testei os scripts abaixo:

Selecionar tudo

select translate( 'Ã',  'õÕãÃ','oOaA') from dual; -- retorna o
select translate( 'Ã',  'ÕõãÃ','OoaA') from dual; -- retorna O
select translate( 'Ã',  'ãÃÕõ','aAOo') from dual; -- retorna a
select translate( 'Ã',  'ÃãÕõ','AaOo') from dual; -- retorna A 
E todos retornaram "A".

Será que tem a ver com algum coisa de configuração regional e/ou de idioma? Que diferencia acentuação e pontuação.

Na minha máquina a configuração é a seguinte:

Selecionar tudo


1	NLS_LANGUAGE		BRAZILIAN PORTUGUESE
2	NLS_TERRITORY		BRAZIL
3	NLS_CURRENCY		R$
4	NLS_ISO_CURRENCY	BRAZIL
5	NLS_NUMERIC_CHARACTERS	,.
6	NLS_CALENDAR		GREGORIAN
7	NLS_DATE_FORMAT		DD/MM/RR
8	NLS_DATE_LANGUAGE	BRAZILIAN PORTUGUESE
9	NLS_SORT		WEST_EUROPEAN
10	NLS_TIME_FORMAT		HH24:MI:SSXFF
11	NLS_TIMESTAMP_FORMAT	DD/MM/RR HH24:MI:SSXFF
12	NLS_TIME_TZ_FORMAT	HH24:MI:SSXFF TZR
13	NLS_TIMESTAMP_TZ_FORMAT	DD/MM/RR HH24:MI:SSXFF TZR
14	NLS_DUAL_CURRENCY	Cr$
15	NLS_COMP		BINARY
16	NLS_LENGTH_SEMANTICS	BYTE
17	NLS_NCHAR_CONV_EXCP	FALSE

Att.,
rtadeum
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qua, 28 Mar 2012 3:15 pm

Tinho
Primeiramente gostaria de agradecer sua resposta. Imaginei que fosse isso também. Alterei a nivel de sessão os parâmetros NLS_LANGUAGE , NLS_TERRITORY etc, mas não funcionou. Será que o Character Set pode influenciar o translate? Fiz o select:

Selecionar tudo

SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER LIKE 'NLS_CHARACTERSET%' 
e o valor é US7ASCII. Não consigo fazer alteração na base pra tentar um outro character set, sem permissão!
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 318
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Olá,

Desculpe-me mas não conhecimentos necessários para poder lhe ajudar, eu faço uma "confusão" danada do ambiente de configuração do oracle, porque tem a configuração do banco, do client, da máquina (SO), chave de registro.

Eu esqueci de perguntar, mas acho importante citar a versão do banco que está utilizando e o sistema operacional.

Por isso, dei uma pesquisada na internet e encontrei os seguintes links, com artigos muito interessante e foruns com dúvidas acerca do problema de acentuação, os quais estou utilizando para esclarecer as minhas dúvidas e que talvez possa lhe ajudar também, segue:

http://tosemopcao.blogspot.com.br/2009/ ... 0g-xe.html
http://aserlorenzo.com/manSQL/Oracle/dm ... umeros.htm
http://forum.imasters.com.br/topic/1843 ... m-charset/
http://www.profissionaloracle.com.br/gp ... ormat=html
http://glufke.net/oracle/viewtopic.php?t=6541
http://info.abril.com.br/forum-antigo/f ... ico=188486

Caso contrário, podemos aguardar algum outro colega aqui do forum, que conheça o caso possa responder.

Abç.,
rtadeum
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qua, 28 Mar 2012 3:15 pm

Tinho
Achei o danado do problema. Realmente era o character set!!
O do trampo é o US7ASCII e o de casa é o WE8MSWIN1252. Eu vi pelo select

Selecionar tudo

SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER LIKE 'NLS_CHARACTERSET%'
Ai eu troquei o CHARACTERSET de casa pelo do trampo

Selecionar tudo

ALTER DATABASE CHARACTER SET INTERNAL_USE US7ASCII
e dá o mesmo problema. No CHARACTERSET da minha maquina ( WE8MSWIN1252 ) vai de boa.

tem uns esquemas antes de alterar o characterset. Você tem que entrar como "sys" e alterar o sistema para "restricted"

Selecionar tudo

Alter system enable restricted session;
Achei uma explicação no site:
https://forums.oracle.com/forums/thread ... ID=1013164
basicamente é isso:

O US7ASCII lhe dá o conjunto de caracteres mais básico, caracteres AZ, 0-9 e pontuação, bom para língua inglesa (geralmente). O principal problema que você vai ter é com outras línguas, muitas línguas européias caracteres acentuados como E e I, por exemplo, que não são representados em US7ASCII enquanto eles estão em WE8MSWIN1252.

O WE8 está para a Europa Ocidental e deve cobrir todas as línguas para aquela região. É claro que línguas como o chinês, japonês ou árabe apresentam desafios ainda mais. Você precisa ler o Guia de Globalização para a sua versão para mais informações.

Valeu pelo help cara!! = )
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 318
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Que bom que conseguiu resolver o problema.

Mas sabe o que me deixa encucado? Independente da configuração do client, não deveria prevalecer a configuração do servidor nestes casos. Já tive problemas de incompatibilidades de formatação de datas e também de moedas, onde o cálculo e a pontuação era feita corretamente na minha máquina em ambiente de desenvolvimento, mas quando eu subia para a alteração em algumas, em apenas algumas máquinas do cliente dava problema.

Não sou DBA, mas creio que isto possa e deva ser parametrizado e configurado na instalação do banco, porque dependendo do número de máquinas fica inviável fazer essa alteração "manualmente".

Abç.,
rtadeum
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qua, 28 Mar 2012 3:15 pm

Com certeza, o que conta é a configuração do servidor. O servidor de homologação aqui do trampo está configurado como US7ASCII. Eu fiz o teste em casa por isso, lá o client e o servidor é na mesma maquina. Ai dá pra alterar de boa!
Responder
  • Informação
  • Quem está online

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