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.