- This topic has 2 replies, 2 voices, and was last updated 5 years, 9 months ago by José Laurindo Chiappa.
-
AuthorPosts
-
11 de fevereiro de 2019 at 2:02 pm #117717sergiomsoParticipant
Pessoal
Boa tarde
É sobre acentuação no Oracle.
A duvida é quando tenho que criar uma view ou uma package no oracle que tenha acentuação.ex. Na minha view contem linhas com com acentuação abaixo….
CASE md.sn_termolabel
WHEN 1
THEN ‘SIM’
ELSE ‘NÃO’
ENDQuando executo sqlplus usando meu client ou executando dentro do sql plus no linux fica sim…… Depois verifico pelo parte grafica SQL DEVELOPER.
CASE md.sn_termolabel
WHEN 1
THEN ‘SIM’
ELSE ‘NÃO’
ENDO regedit do meu cliente para mim estão corretos… Não deveria funcionar com este NLS_LANG?
NLS_LANG BRAZILIAN PORTUGUESE_BRAZIL.WE8MSWIN1252
11 de fevereiro de 2019 at 5:14 pm #117720José Laurindo ChiappaModeratorBlz ? Então, tem uma ** série ** de conceitos (a Maioria deles não inventado pelo Oracle) que entram em questão aí…. Primeira coisa (que Acredito que vc sabe, mas enfim) é o Conceito (esse sim, do próprio RDBMS Oracle) que num database Oracle as propriedades NLS (ie, Linguagem, território, codificação de caracteres, formato de data, etc, etc, etc) se comportam como um DEFAULT, ie, são usadas SE o cliente não informar nada, sim sim sim ? E claro, além de servirem como DEFUALT, são também o ALVO para onde a config do cliente vai ser Convertida, okdoc ?? Ou seja : num banco criado com characterset WE8MSWIN1252 (digamos), não só se o cliente não informar rigorosamente nada de characterset ele vai usar esse aí, mas TAMBÉM, se o cliente informar um characterset qquer é para o WE8MSWIN1252 que esse outro characterset VAI tentar ser convertido, okdoc ??
Esse primeiro ponto estando Claro e Compreendido, aí vem o SEGUNDO PONTO : via de regra nós acessamos uma máquina remota via um software de terminal qualquer (no Linux, é comum o PuTTY, mas N outros existem) – nem preciso dizer, imagino, que (principalmente para Linux) NA CONFIG DESSE SOFTWARE de terminal vc OBRIGATORIAMENTE TEM que indicar QUAL a representação de caracteres que o software vai usar : pro PuTTY por exemplo vc seta isso no menu Window opção Translation… Outros terminais necessariamente TAMBÉM tem alguma opção onde vc setar isso : (no K-TERM default de algumas distros Linux é, na própria janela do terminal, no menu Terminal a opção Set Character Encoding) , esteja 100% CERTO de estar usando o setting correto…Finalmente, chegamos no TERCEIRO PONTO, que Muito Provavelmente deve estar causando o seu problema : além das opções de NLS do seu programa-cliente estarem corretas (o que normalmente se faz com as variáveis de ambiente Oracle NLS_LANG, NLS_CHACARCTERSET, NLS_DATE_FORMAT, etc) , ALÉM DISSO normalmente de tem ENCODINGS NO PRÓPRIO prompt que devem ser setados : no prompt de comandos Windows isso é o CODEPAGE, no prompt de comandos Linux é o LOCALE : veja https://eduardolegatti.blogspot.com/2011/01/habilitando-o-suporte-acentuacao-no.html pra um exemplo no Windows, onde as vars NLS tavam ok, a config no banco tava OK, o que ficou faltando é o encoding DO PROMPT DE COMANDOS USADO, no exemplo feito via CHCP, já que era Windows… No Linux esse encoding do prompt de comandos pode variar de acordo com o shell em uso, mas no bash (um dos mais usados) é o comando LOCALE…
==> Essa é a sua resposta, então : ABSOLUTAMENTE NÂO BASTA só setar as variáveis Oracle NLS_xxx (seja no registry, seja no prompt de comandos) : para vc poder usar Acentuação no RDBMS Oracle, vc TEM que ter as propriedades corretas no database, TEM que ter os settings de NLS corretos no seu programa-cliente (se for sqlplus ou algum programa que conecte no banco Oracle via OCI, realmente vc seta isso via variáveis NLS, correto), vc TEM que ter o software de Terminal corretamente configurado e FINALMENTE, vc TEM QUE TER o ENCODING CORRETO no seu prompt de comando… Okdoc ??
[]s
Chiappa
11 de fevereiro de 2019 at 5:44 pm #117722José Laurindo ChiappaModeratorSo pra não ficar no blablablá, eis um exemplo possível : tenho um banco com characterset apropriado, veja aqui :
SQL> select * from nls_database_parameters;
PARAMETER VALUE
—————————— ———————————
NLS_LANGUAGE BRAZILIAN PORTUGUESE
NLS_TERRITORY BRAZIL
NLS_CURRENCY R$
NLS_ISO_CURRENCY BRAZIL
NLS_NUMERIC_CHARACTERS ,.
NLS_CHARACTERSET WE8MSWIN1252
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD/MM/RR
NLS_DATE_LANGUAGE BRAZILIAN PORTUGUESE
NLS_SORT WEST_EUROPEAN
NLS_TIME_FORMAT HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT DD/MM/RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT DD/MM/RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY Cr$
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION 11.2.0.4.020 linhas selecionadas.
SQL> exit
==> No caso estou com um client rodando em Windows, as variáveis NLS tão corretas no registry, ORACLE_HOME está setado ok apontando pra essa ORACLE_HOME com os valores NLS ok, o teclado está setado como PT-BR padrão ABNT2, o Windows tá em Português MAS olha aqui o encoding errado :
C:\Users\jlchi_000>chcp
Página de código ativa: 850C:\Users\jlchi_000>
==> Ok, vou criar uma procedure que tem uma string acentuada, PARECE que funciona ok :
SQL> create or replace procedure P1 is
2 x varchar2(100);
3 BEGIN
4 select ‘Ação’ into x from dual;
5 END;
6 /Procedimento criado.
SQL> select line, text from user_source where name=’P1′ order by line;
LINE TEXT
———- ——————————————————————————–
1 procedure P1 is
2 x varchar2(100);
3 BEGIN
4 select ‘Ação’ into x from dual;
5 END;SQL> exit
===> MAS está Gravado incorretamente!! Ao consultar o código dessa P1 pelo ORACLE SQL DEVELOPER (que por ser feito em Java usa SEMPRE UNICODE) aí nós vemos isso :
create or replace procedure P1 is
x varchar2(100);
BEGIN
select ‘A‡Æo’ into x from dual;
END;Hummmm… Vamos CORRIGIR O ENCODING NO PROMPT DE COMANDO :
C:\Users\jlchi_000>chcp 1250
Página de código ativa: 1250C:\Users\jlchi_000>sqlplus system/oracle
SQL*Plus: Release 11.2.0.4.0 Production
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Conectado a:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 – 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining
and Real Application Testing optionsSQL> create or replace procedure P1 is
2 x varchar2(100);
3 BEGIN
4 select ‘Ação’ into x from dual;
5 END;
6 /Procedimento criado.
SQL> exit
Desconectado de Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 – 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining
and Real Application Testing optionsC:\Users\jlchi_000>
==> Agora olha o que eu obtenho fazendo um refresh no SQL DEVELOPER :
create or replace procedure P1 is
x varchar2(100);
BEGIN
select ‘Ação’ into x from dual;
END;OKDOC ??? C.Q.D. Como Queríamos Demonstrar….
No seu caso, como vc diz que foi depois de editar via sqlplus no Linux que o ‘problema’ ocorreu, sabendo que sqlplus SIGNIFICA PROMPT DE COMANDO, pra mim é muito MUITO provável que seu ‘problema’ seja encoding incorreto no prompt Linux, que pra Linux é o comando LOCALE…. E Aponto de Novo, é COMUM no Linux vc usar um software de TERMINAL que precisa ser Ajustado corretamente também, veja lá…..
[]s
Chiappa
OBS : para alguns testes mais detalhados, vide meu blog em https://jlc1967.wordpress.com/2015/02/25/nls-acentuacao-e-outros-misterios-de-localizacao-no-rdbms-oracle/ …..
-
AuthorPosts
- You must be logged in to reply to this topic.