Pular para o conteúdo
  • This topic has 2 replies, 2 voices, and was last updated 5 years, 9 months ago by Avatar photoJosé Laurindo Chiappa.
Viewing 3 posts - 1 through 3 (of 3 total)
  • Author
    Posts
  • #117717
    Avatar de sergiomsosergiomso
    Participant

      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’
      END

      Quando 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’
      END

      O regedit do meu cliente para mim estão corretos… Não deveria funcionar com este NLS_LANG?

      NLS_LANG BRAZILIAN PORTUGUESE_BRAZIL.WE8MSWIN1252

      #117720
      Avatar photoJosé Laurindo Chiappa
      Moderator

        Blz ? 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

        #117722
        Avatar photoJosé Laurindo Chiappa
        Moderator

          So 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.0

          20 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: 850

          C:\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: 1250

          C:\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 options

          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> 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 options

          C:\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/ …..

        Viewing 3 posts - 1 through 3 (of 3 total)
        • You must be logged in to reply to this topic.
        plugins premium WordPress