SQL em Oracle > DML > Funções > Funções de linha > Suporte a línguas nacionais - variáveis NLS
Suporte a línguas nacionais - variáveis NLS logotipo.gif

A base de dados adapta-se às características específicas dos vários países no que diz repeito ao formato das datas, números, quantias monetárias e sequência de ordenação de cadeias de caracteres. Neste ponto vamos ver:


Quais as variáveis de ambiente que influenciam estes formatos?

A tabela abaixo mostra as variáveis mais importantes para alterar os formatos de datas, números, quantias monetárias e critérios de ordenação de cadeias de caracteres. Estas variáveis pertencem ao conjunto NLS - National Language Support.

As variáveis NLS estão divididas em grupos. Cada grupo tem uma variável principal, que quando recebe um valor atribui valores relacionados a todos os elementos do seu grupo. A variável NLS_LANGUAGE é principal e no seu grupo incluem-se NLS_DATE_FORMAT, NLS_DATE_LANGUAGE e NLS_SORT. A variável NLS_TERRITORY é principal e no seu grupo inclui-se NLS_CURRENCY.

A coluna INIT.ORA da tabela abaixo indica se a variável pode receber valor no ficheiro de configuração da instância (INIT.ORA). A coluna Variável de ambiente indica se a variável pode ser definida como uma variável de ambiente no sistema operativo do cliente Oracle. A coluna ALTER SESSION indica se a variável pode ser modificada usando um comando ALTER SESSION dentro de uma sessão cliente.

Nome O que altera Exemplo Valor por omissão INIT.ORA Variável de ambiente ALTER SESSION
NLS_LANG Altera NLS_TERRITORY e NLS_LANGUAGE e permite definir um "character set". Quando o "character set" do servidor é diferente do utilizado pelo cliente é feita a conversão dos formatos durante a passagem de dados do cliente para o servidor PORTUGUESE_PORTUGAL.WE8ISO8859P15 AMERICAN_AMERICA.US7ASCII Não Sim Não
NLS_TERRITORY Altera o formato da data, o dia em que começa a semana, o símbolo de moeda, o separador décimal e o separador dos milhares. PORTUGAL NLS_LANG Sim Não Sim
NLS_LANGUAGE Altera as mensagens da base de dados (se tiverem sido instaladas nessa lingua), os nomes dos dias da semana, os nomes dos meses, os simbolos de hora e século (AM, PM, BC, AC), a sequência de ordenação de cadeias de caracteres e o valor das respostas true/false (sim/não) PORTUGUESE NLS_LANG Sim Não Sim
NLS_DATE_FORMAT Altera o formato da data. 'YYYY-MM-DD HH24:MI:SS' NLS_LANGUAGE Sim Sim Sim
NLS_DATE_LANGUAGE Altera a língua usada na data sem alterar os formatos de números. PORTUGUESE NLS_LANGUAGE Sim Sim Sim
NLS_CURRENCY Altera o simbolo de moeda. Pode ser um ou mais caracteres. 'EUR ' NLS_TERRITORY Sim Sim Sim
NLS_SORT Altera a linguística usada numa ordenação de caracteres. Não usa apenas os códigos núméricos dos caracteres mas também tem em conta os caracteres acentuados. Nem todas as linguas são suportadas. Os valores possíveis estão na vista V$NLS_VALID_VALUES GERMANY NLS_LANGUAGE Sim Sim Sim

Várias variáveis da tabela anterior podem estar definidas ao mesmo tempo. Se receberem valores diferentes que entram em conflito entre si, entra em vigor a tabela de prioridades apresentada abaixo:

Prioridade Definição Ambiente afectado
1 Definição explicita numa função de um comando SQL O comando que usa a função: to_char(sysdate,'Mon dd hh24:mi:ss','nls_date_language=american')
2 Definida por um comando ALTER SESSION Todos os comandos executados depois do ALTER SESSION
3 Definida como uma variável de ambiente Todas as sessões Oracle inciadas com essa variável activa. No caso dos ambientes Windows pode ser definida em 3 sitios: no registry, nas propriedades do sistema e numa sessão CMD (DOS) com o comando SET NOME=VALOR
4 Definida no ficheiro INIT.ORA Afecta todas as sessões que se ligam à base de dados. Alguns parâmetros ficam activos imediatamente, outros requerem paragem/arranque da BD. Consultar a vista V$PARAMETER
5 Não definida A BD assume LANGUAGE=AMERICAN, TERRITORY=AMERICA

A base de dados arranca e assume as definições do ficheiro de parâmetros INIT.ORA. Por omissão assume AMERICAN_AMERICA. Definir NLS_LANG numa variável de ambiente sobrepõe-se às definições na instância, condicionando as sessões criadas com essa variável definida. Um comando ALTER SESSION sobrepõe-se ao NLS_LANG e à definição na instância. Uma definição numa função SQL sobrepõe-se a tudo o que tenha sido definido anteriormente.

A vista V$NLS_VALID_VALUES contem os valores disponíveis para as variáveis NLS. O manual "Oracle National Language Support Guide" dedica-se apenas a este tema.

bthome.gifTopo


Como ver os valores das variáveis NLS?

Nos exemplos abaixo vamos ver como estão definidos os parâmetros NLS nos vários níveis.

Parâmetros NLS na base de dados:

prompt Parametros NLS na base de dados;
select * from NLS_DATABASE_PARAMETERS;
Parametros NLS na base de dados

PARAMETER                      VALUE                                    
------------------------------ ---------------------------------------- 
NLS_LANGUAGE                   AMERICAN                                 
NLS_TERRITORY                  AMERICA                                  
NLS_CURRENCY                   $                                        
NLS_ISO_CURRENCY               AMERICA                                  
NLS_NUMERIC_CHARACTERS         .,                                       
NLS_CHARACTERSET               WE8MSWIN1252                             
NLS_CALENDAR                   GREGORIAN                                
NLS_DATE_FORMAT                DD-MON-RR                                
NLS_DATE_LANGUAGE              AMERICAN                                 
NLS_SORT                       BINARY                                   
NLS_TIME_FORMAT                HH.MI.SSXFF AM                           
NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM                 
NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR                       
NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR             
NLS_DUAL_CURRENCY              $                                        
NLS_COMP                       BINARY                                   
NLS_LENGTH_SEMANTICS           BYTE                                     
NLS_NCHAR_CONV_EXCP            FALSE                                    
NLS_NCHAR_CHARACTERSET         AL16UTF16                                
NLS_RDBMS_VERSION              10.2.0.1.0                               

20 rows selected

Parâmetros NLS na instância:

prompt Parametros NLS na instância;
select * from NLS_INSTANCE_PARAMETERS;
Parametros NLS na instância

PARAMETER                      VALUE                                    
------------------------------ ---------------------------------------- 
NLS_LANGUAGE                   AMERICAN                                 
NLS_TERRITORY                  AMERICA                                  
NLS_SORT                                                                
NLS_DATE_LANGUAGE                                                       
NLS_DATE_FORMAT                                                         
NLS_CURRENCY                                                            
NLS_NUMERIC_CHARACTERS                                                  
NLS_ISO_CURRENCY                                                        
NLS_CALENDAR                                                            
NLS_TIME_FORMAT                                                         
NLS_TIMESTAMP_FORMAT                                                    
NLS_TIME_TZ_FORMAT                                                      
NLS_TIMESTAMP_TZ_FORMAT                                                 
NLS_DUAL_CURRENCY                                                       
NLS_COMP                                                                
NLS_LENGTH_SEMANTICS           BYTE                                     
NLS_NCHAR_CONV_EXCP            FALSE                                    

17 rows selected

Parametros NLS na sessão cliente depois de alter session:

prompt Parametros NLS na sessão cliente depois de alter session;
alter session set nls_territory=portugal;
alter session set nls_language=portuguese;
select * from NLS_SESSION_PARAMETERS;
Parametros NLS na sessão cliente depois de alter session

alter session set succeeded.

alter session set succeeded.

PARAMETER                      VALUE                                    
------------------------------ ---------------------------------------- 
NLS_LANGUAGE                   PORTUGUESE                               
NLS_TERRITORY                  PORTUGAL                                 
NLS_CURRENCY                   ¿                                        
NLS_ISO_CURRENCY               PORTUGAL                                 
NLS_NUMERIC_CHARACTERS         ,.                                       
NLS_CALENDAR                   GREGORIAN                                
NLS_DATE_FORMAT                RR.MM.DD                                 
NLS_DATE_LANGUAGE              PORTUGUESE                               
NLS_SORT                       WEST_EUROPEAN                            
NLS_TIME_FORMAT                HH24:MI:SSXFF                            
NLS_TIMESTAMP_FORMAT           RR.MM.DD HH24:MI:SSXFF                   
NLS_TIME_TZ_FORMAT             HH24:MI:SSXFF TZR                        
NLS_TIMESTAMP_TZ_FORMAT        RR.MM.DD HH24:MI:SSXFF TZR               
NLS_DUAL_CURRENCY              ¿                                        
NLS_COMP                       BINARY                                   
NLS_LENGTH_SEMANTICS           BYTE                                     
NLS_NCHAR_CONV_EXCP            FALSE                                    

17 rows selected


Como alterar o formato dos números e o símbolo de moeda?

O formato de números e o símbolo de moeda podem ser alterados usando as variáveis NLS e/ou usando a função TO_CHAR com uma máscara. Para saber mais da função TO_CHAR siga este link. O exemplo abaixo mostra como as variáveis NLS_TERRITORY e NLS_LANGUAGE influenciam estes formatos:

prompt nls_territory=america
alter session set nls_territory=america;
select to_char(12345.6789,'099G999G999D99L') from dual;

prompt nls_territory=france
alter session set nls_territory=france;
select to_char(12345.6789,'099G999G999D99L') from dual;

prompt nls_territory=portugal
alter session set nls_territory=portugal;
select to_char(12345.6789,'099G999G999D99L') from dual;
nls_territory=america

alter session set succeeded.

TO_CHAR(12345.6789,'099G999G999D99L') 
------------------------------------- 
          000,012,345.68$             

1 rows selected


nls_territory=france

alter session set succeeded.

TO_CHAR(12345.6789,'099G999G999D99L') 
------------------------------------- 
          000 012 345,68¿             

1 rows selected


nls_territory=portugal

alter session set succeeded.

TO_CHAR(12345.6789,'099G999G999D99L') 
------------------------------------- 
          000.012.345,68¿             

1 rows selected

O comando abaixo deveria listar os salários dos empregados seguindo a convenção portuguesa para o formato de quantias monetárias, pois novamente estamos a usar uma máscara com os símbolos L, G e D

alter session set nls_territory='PORTUGAL';
alter session set nls_language='PORTUGUESE';
select to_char(sal,'999G999D99L')  from emp;
alter session set succeeded.

alter session set succeeded.

TO_CHAR(SAL,'999G999D99L') 
-------------------------- 
              800,00¿      
            1.600,00¿      
            1.250,00¿      
            2.975,00¿      
            1.250,00¿      
            2.850,00¿      
            2.450,00¿      
            3.000,00¿      
            5.000,00¿      
            1.500,00¿      
            1.100,00¿      
              950,00¿      
            3.000,00¿      
            1.300,00¿      

14 rows selected

alter session set nls_territory='PORTUGAL';
alter session set nls_language='PORTUGUESE';
alter session set nls_currency=' EUR';
select * from NLS_SESSION_PARAMETERS;
select to_char(sal,'999G999D99L') from emp;
alter session set succeeded.

alter session set succeeded.

alter session set succeeded.

PARAMETER                      VALUE                                    
------------------------------ ---------------------------------------- 
NLS_LANGUAGE                   PORTUGUESE                               
NLS_TERRITORY                  PORTUGAL                                 
NLS_CURRENCY                    EUR                                     
NLS_ISO_CURRENCY               PORTUGAL                                 
NLS_NUMERIC_CHARACTERS         ,.                                       
NLS_CALENDAR                   GREGORIAN                                
NLS_DATE_FORMAT                RR.MM.DD                                 
NLS_DATE_LANGUAGE              PORTUGUESE                               
NLS_SORT                       WEST_EUROPEAN                            
NLS_TIME_FORMAT                HH24:MI:SSXFF                            
NLS_TIMESTAMP_FORMAT           RR.MM.DD HH24:MI:SSXFF                   
NLS_TIME_TZ_FORMAT             HH24:MI:SSXFF TZR                        
NLS_TIMESTAMP_TZ_FORMAT        RR.MM.DD HH24:MI:SSXFF TZR               
NLS_DUAL_CURRENCY              ¿                                        
NLS_COMP                       BINARY                                   
NLS_LENGTH_SEMANTICS           BYTE                                     
NLS_NCHAR_CONV_EXCP            FALSE                                    

17 rows selected


TO_CHAR(SAL,'999G999D99L') 
-------------------------- 
           800,00 EUR      
         1.600,00 EUR      
         1.250,00 EUR      
         2.975,00 EUR      
         1.250,00 EUR      
         2.850,00 EUR      
         2.450,00 EUR      
         3.000,00 EUR      
         5.000,00 EUR      
         1.500,00 EUR      
         1.100,00 EUR      
           950,00 EUR      
         3.000,00 EUR      
         1.300,00 EUR      

14 rows selected

O mesmo resultado pode ser obtido usando uma parametrização ao nível da funçao SQL, como mostra o comando abaixo:

alter session set nls_territory='PORTUGAL';
alter session set nls_language='PORTUGUESE';
select to_char(sal,'999G999D99L') from emp;
select to_char(sal,'999G999D99L','nls_currency='' EUR''') from emp;
alter session set succeeded.

alter session set succeeded.

TO_CHAR(SAL,'999G999D99L') 
-------------------------- 
              800,00¿      
            1.600,00¿      
            1.250,00¿      
            2.975,00¿      
            1.250,00¿      
            2.850,00¿      
            2.450,00¿      
            3.000,00¿      
            5.000,00¿      
            1.500,00¿      
            1.100,00¿      
              950,00¿      
            3.000,00¿      
            1.300,00¿      

14 rows selected


TO_CHAR(SAL,'999G999D99L','NLS_CURRENCY=''EUR''') 
------------------------------------------------- 
           800,00 EUR                             
         1.600,00 EUR                             
         1.250,00 EUR                             
         2.975,00 EUR                             
         1.250,00 EUR                             
         2.850,00 EUR                             
         2.450,00 EUR                             
         3.000,00 EUR                             
         5.000,00 EUR                             
         1.500,00 EUR                             
         1.100,00 EUR                             
           950,00 EUR                             
         3.000,00 EUR                             
         1.300,00 EUR                             

14 rows selected

bthome.gifTopo


Como alterar os formatos das datas?

O formato usado para as datas é influenciado por NLS_TERRITORY e NLS_LANGUAGE, como mostra o próximo exemplo:

prompt Territory=AMERICA, Language=AMERICAN
alter session set nls_territory='AMERICA';
alter session set nls_language='AMERICAN';
select 
  hiredate, 
  to_char(hiredate,'yyyy-mm-dd'), 
  to_char(hiredate,'yyyy-MON-dd, Day'),
  to_char(hiredate,'Day, dd "," Month "," YYYY')
from emp;


prompt Territory=FRANCE, Language=FRENCH
alter session set nls_territory='FRANCE';
alter session set nls_language='FRENCH';
select 
  hiredate, 
  to_char(hiredate,'yyyy-mm-dd'), 
  to_char(hiredate,'yyyy-MON-dd, Day'),
  to_char(hiredate,'Day, dd "," Month "," YYYY')
from emp;

prompt Territory=Portugal, Language=Portuguese
alter session set nls_territory='PORTUGAL';
alter session set nls_language='PORTUGUESE';
select 
  hiredate, 
  to_char(hiredate,'yyyy-mm-dd'), 
  to_char(hiredate,'yyyy-MON-dd, Day'),
  to_char(hiredate,'Day, dd "de" Month "de" YYYY')
from emp;
Territory=AMERICA, Language=AMERICAN

alter session set succeeded.

alter session set succeeded.

HIREDATE                  TO_CHAR(HIREDATE,'YYYY-MM-DD') TO_CHAR(HIREDATE,'YYYY-MON-DD,DAY') TO_CHAR(HIREDATE,'DAY,DD","MONTH","YYYY') 
------------------------- ------------------------------ ----------------------------------- ----------------------------------------- 
17-DEC-80                 1980-12-17                     1980-DEC-17, Wednesday              Wednesday, 17 , December  , 1980          
20-FEB-81                 1981-02-20                     1981-FEB-20, Friday                 Friday   , 20 , February  , 1981          
22-FEB-81                 1981-02-22                     1981-FEB-22, Sunday                 Sunday   , 22 , February  , 1981          
02-APR-81                 1981-04-02                     1981-APR-02, Thursday               Thursday , 02 , April     , 1981          
28-SEP-81                 1981-09-28                     1981-SEP-28, Monday                 Monday   , 28 , September , 1981          
01-MAY-81                 1981-05-01                     1981-MAY-01, Friday                 Friday   , 01 , May       , 1981          
09-JUN-81                 1981-06-09                     1981-JUN-09, Tuesday                Tuesday  , 09 , June      , 1981          
09-DEC-82                 1982-12-09                     1982-DEC-09, Thursday               Thursday , 09 , December  , 1982          
17-NOV-81                 1981-11-17                     1981-NOV-17, Tuesday                Tuesday  , 17 , November  , 1981          
08-SEP-81                 1981-09-08                     1981-SEP-08, Tuesday                Tuesday  , 08 , September , 1981          
12-JAN-83                 1983-01-12                     1983-JAN-12, Wednesday              Wednesday, 12 , January   , 1983          
03-DEC-81                 1981-12-03                     1981-DEC-03, Thursday               Thursday , 03 , December  , 1981          
03-DEC-81                 1981-12-03                     1981-DEC-03, Thursday               Thursday , 03 , December  , 1981          
23-JAN-82                 1982-01-23                     1982-JAN-23, Saturday               Saturday , 23 , January   , 1982          

14 rows selected


Territory=FRANCE, Language=FRENCH

alter session set succeeded.

alter session set succeeded.

HIREDATE                  TO_CHAR(HIREDATE,'YYYY-MM-DD') TO_CHAR(HIREDATE,'YYYY-MON-DD,DAY') TO_CHAR(HIREDATE,'DAY,DD","MONTH","YYYY') 
------------------------- ------------------------------ ----------------------------------- ----------------------------------------- 
17/12/80                  1980-12-17                     1980-DÉC. -17, Mercredi             Mercredi, 17 , Décembre  , 1980           
20/02/81                  1981-02-20                     1981-FÉVR.-20, Vendredi             Vendredi, 20 , Février   , 1981           
22/02/81                  1981-02-22                     1981-FÉVR.-22, Dimanche             Dimanche, 22 , Février   , 1981           
02/04/81                  1981-04-02                     1981-AVR. -02, Jeudi                Jeudi   , 02 , Avril     , 1981           
28/09/81                  1981-09-28                     1981-SEPT.-28, Lundi                Lundi   , 28 , Septembre , 1981           
01/05/81                  1981-05-01                     1981-MAI  -01, Vendredi             Vendredi, 01 , Mai       , 1981           
09/06/81                  1981-06-09                     1981-JUIN -09, Mardi                Mardi   , 09 , Juin      , 1981           
09/12/82                  1982-12-09                     1982-DÉC. -09, Jeudi                Jeudi   , 09 , Décembre  , 1982           
17/11/81                  1981-11-17                     1981-NOV. -17, Mardi                Mardi   , 17 , Novembre  , 1981           
08/09/81                  1981-09-08                     1981-SEPT.-08, Mardi                Mardi   , 08 , Septembre , 1981           
12/01/83                  1983-01-12                     1983-JANV.-12, Mercredi             Mercredi, 12 , Janvier   , 1983           
03/12/81                  1981-12-03                     1981-DÉC. -03, Jeudi                Jeudi   , 03 , Décembre  , 1981           
03/12/81                  1981-12-03                     1981-DÉC. -03, Jeudi                Jeudi   , 03 , Décembre  , 1981           
23/01/82                  1982-01-23                     1982-JANV.-23, Samedi               Samedi  , 23 , Janvier   , 1982           

14 rows selected


Territory=Portugal, Language=Portuguese

alter session set succeeded.

alter session set succeeded.

HIREDATE                  TO_CHAR(HIREDATE,'YYYY-MM-DD') TO_CHAR(HIREDATE,'YYYY-MON-DD,DAY') TO_CHAR(HIREDATE,'DAY,DD"DE"MONTH"DE"YYYY') 
------------------------- ------------------------------ ----------------------------------- ------------------------------------------- 
80.12.17                  1980-12-17                     1980-DEZ-17, Quarta-Feira           Quarta-Feira , 17 de Dezembro  de 1980      
81.02.20                  1981-02-20                     1981-FEV-20, Sexta-Feira            Sexta-Feira  , 20 de Fevereiro de 1981      
81.02.22                  1981-02-22                     1981-FEV-22, Domingo                Domingo      , 22 de Fevereiro de 1981      
81.04.02                  1981-04-02                     1981-ABR-02, Quinta-Feira           Quinta-Feira , 02 de Abril     de 1981      
81.09.28                  1981-09-28                     1981-SET-28, Segunda-Feira          Segunda-Feira, 28 de Setembro  de 1981      
81.05.01                  1981-05-01                     1981-MAI-01, Sexta-Feira            Sexta-Feira  , 01 de Maio      de 1981      
81.06.09                  1981-06-09                     1981-JUN-09, Terça-Feira            Terça-Feira  , 09 de Junho     de 1981      
82.12.09                  1982-12-09                     1982-DEZ-09, Quinta-Feira           Quinta-Feira , 09 de Dezembro  de 1982      
81.11.17                  1981-11-17                     1981-NOV-17, Terça-Feira            Terça-Feira  , 17 de Novembro  de 1981      
81.09.08                  1981-09-08                     1981-SET-08, Terça-Feira            Terça-Feira  , 08 de Setembro  de 1981      
83.01.12                  1983-01-12                     1983-JAN-12, Quarta-Feira           Quarta-Feira , 12 de Janeiro   de 1983      
81.12.03                  1981-12-03                     1981-DEZ-03, Quinta-Feira           Quinta-Feira , 03 de Dezembro  de 1981      
81.12.03                  1981-12-03                     1981-DEZ-03, Quinta-Feira           Quinta-Feira , 03 de Dezembro  de 1981      
82.01.23                  1982-01-23                     1982-JAN-23, Sábado                 Sábado       , 23 de Janeiro   de 1982      

14 rows selected

Algumas funções Oracle permitem a recepção de parâmetros NLS para formatar o resultado. No exemplo abaixo, embora NLS_LANGUAGE receba o valor AMERICAN e NLS_TERRITORY o valor AMERICA a data aparece no formato Português, graças ao parâmetro usado na função.

prompt NLS_LANGUAGE=AMERICAN, NLS_TERRITORY=AMERICA
alter session set nls_language=american;
alter session set nls_territory=america;
select 
  to_char(hiredate, 'YYYY-Mon-DD'),
  to_char(hiredate, 'YYYY-Mon-DD', 'nls_date_language=PORTUGUESE')
from emp;
NLS_LANGUAGE=AMERICAN, NLS_TERRITORY=AMERICA

alter session set succeeded.

alter session set succeeded.

TO_CHAR(HIREDATE,'YYYY-MON-DD') TO_CHAR(HIREDATE,'YYYY-MON-DD','NLS_DATE_LANGUAGE=PORTUGUESE') 
------------------------------- -------------------------------------------------------------- 
1980-Dec-17                     1980-Dez-17                                                    
1981-Feb-20                     1981-Fev-20                                                    
1981-Feb-22                     1981-Fev-22                                                    
1981-Apr-02                     1981-Abr-02                                                    
1981-Sep-28                     1981-Set-28                                                    
1981-May-01                     1981-Mai-01                                                    
1981-Jun-09                     1981-Jun-09                                                    
1982-Dec-09                     1982-Dez-09                                                    
1981-Nov-17                     1981-Nov-17                                                    
1981-Sep-08                     1981-Set-08                                                    
1983-Jan-12                     1983-Jan-12                                                    
1981-Dec-03                     1981-Dez-03                                                    
1981-Dec-03                     1981-Dez-03                                                    
1982-Jan-23                     1982-Jan-23                                                    

14 rows selected

bthome.gifTopo


Como alterar a sequência de ordenação das cadeias de caracteres?

A sequência de ordenação das cadeias de caracteres é influenciada pelo valor da variável NLS_LANGUAGE, como mostra o exemplo abaixo:

  1. Criar uma tabela que contenha caracteres acentuados:
    drop table teste_sort;
    create table teste_sort (nome varchar2(30));
    insert into teste_sort values ('José');
    insert into teste_sort values ('josé');
    insert into teste_sort values ('JOSÉ');
    insert into teste_sort values ('JOSE');
    insert into teste_sort values ('JOAO');
    insert into teste_sort values ('JOÃO');
    insert into teste_sort values ('João');
    insert into teste_sort values ('Joao');
        
    drop table teste_sort succeeded.
    
    create table succeeded.
    
    1 rows inserted
    
    1 rows inserted
    
    1 rows inserted
    
    1 rows inserted
    
    1 rows inserted
    
    1 rows inserted
    
    1 rows inserted
    
    1 rows inserted
        
  2. Listar a tabela ordenando o resultado com NLS_LANGUAGE=AMERICAN
    prompt NLS_LANGUAGE=AMERICAN
    alter session set nls_language=american;
    select * from teste_sort order by nome;
        
    NLS_LANGUAGE=AMERICAN
    
    alter session set succeeded.
    
    NOME                           
    ------------------------------ 
    JOAO                           
    JOSE                           
    JOSÉ                           
    JOÃO                           
    Joao                           
    José                           
    João                           
    josé                           
    
    8 rows selected
        
  3. Listar a tabela ordenando o resultado com NLS_LANGUAGE=PORTUGUESE
    prompt NLS_LANGUAGE=PORTUGUESE
    alter session set nls_language=portuguese;
    select * from teste_sort order by nome;
        
    NLS_LANGUAGE=PORTUGUESE
    
    alter session set succeeded.
    
    NOME                           
    ------------------------------ 
    JOAO                           
    JOÃO                           
    Joao                           
    João                           
    JOSE                           
    JOSÉ                           
    José                           
    josé                           
    
    8 rows selected
        

A variável NLS_SORT define a sequência de ordenação e o seu valor depende da atribuição inicial dada a NLS_LANGUAGE. A utilização desta variável permite variar a sequência de ordenação sem modificar os outros parâmetros incluídos no grupo NLS_LANGUAGE. A vista V$NLS_VALID_VALUES contem os valores possíveis de NLS_SORT. No exemplo abaixo atribuímos a NLS_LANGUAGE o valor PORTUGUESE e depois disso fazemos duas ordenações: a primeira segue um critério binário, enquanto a segunda segue WEST_EUROPEAN (adequada para Portugal).

prompt NLS_LANGUAGE=PORTUGUESE
alter session set nls_language=portuguese;

prompt NLS_SORT=BINARY
alter session set nls_sort=binary;
select * from teste_sort order by nome;

prompt NLS_SORT=WEST_EUROPEAN
alter session set nls_sort=west_european;
select * from teste_sort order by nome;
NLS_LANGUAGE=PORTUGUESE

alter session set succeeded.

NLS_SORT=BINARY

alter session set succeeded.

NOME                           
------------------------------ 
JOAO                           
JOSE                           
JOSÉ                           
JOÃO                           
Joao                           
José                           
João                           
josé                           

8 rows selected


NLS_SORT=WEST_EUROPEAN

alter session set succeeded.

NOME                           
------------------------------ 
JOAO                           
JOÃO                           
Joao                           
João                           
JOSE                           
JOSÉ                           
José                           
josé                           

8 rows selected

bthome.gifTopo


Realizado por Jose Aser Lorenzo. Última alteração em 2011-02-26