Pular para o conteúdo

Fóruns Banco de dados Oracle Acentuação Oracle Responder a: Acentuação Oracle

#117722
Avatar photoJosé Laurindo Chiappa
Moderador

    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/ …..