Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Configuração NLS_NUMERIC_CHARACTERS para decimal


Você pode ver suas configurações de sessão atuais consultando nls_session_parameters :
select value
from nls_session_parameters
where parameter = 'NLS_NUMERIC_CHARACTERS';

VALUE                                  
----------------------------------------
.,                                       

Isso pode ser diferente dos padrões do banco de dados, que você pode ver em nls_database_parameters .

Nesta sessão, seus erros de consulta:
select to_number('100,12') from dual;

Error report -
SQL Error: ORA-01722: invalid number
01722. 00000 -  "invalid number"

Eu poderia alterar minha sessão, diretamente com alter session ou garantindo que meu cliente esteja configurado de uma maneira que leve à configuração que a string precisa (pode ser herdada de um sistema operacional ou localidade Java, por exemplo):
alter session set NLS_NUMERIC_CHARACTERS = ',.';
select to_number('100,12') from dual;

TO_NUMBER('100,12')
-------------------
             100,12 

No SQL Developer você pode definir seu valor preferido em Tool->Preferences->Database->NLS.

Mas também posso substituir essa configuração de sessão como parte da consulta, com o terceiro opcional nlsparam parâmetro para to_number(); embora isso torne o segundo opcional fmt parâmetro necessário também, então você precisa ser capaz de escolher um formato adequado:
alter session set NLS_NUMERIC_CHARACTERS = '.,';
select to_number('100,12', '99999D99', 'NLS_NUMERIC_CHARACTERS='',.''')
from dual;

TO_NUMBER('100,12','99999D99','NLS_NUMERIC_CHARACTERS='',.''')
--------------------------------------------------------------
                                                        100.12 

Por padrão, o resultado ainda é exibido com as configurações da minha sessão, portanto, o separador decimal ainda é um ponto.