sql >> Base de Datos >  >> RDS >> Oracle

Configuración de NLS_NUMERIC_CHARACTERS para decimal

Puede ver la configuración de su sesión actual consultando nls_session_parameters :

select value
from nls_session_parameters
where parameter = 'NLS_NUMERIC_CHARACTERS';

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

Eso puede diferir de los valores predeterminados de la base de datos, que puede ver en nls_database_parameters .

En esta sesión su consulta falla:

select to_number('100,12') from dual;

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

Podría alterar mi sesión, ya sea directamente con alter session o asegurándome de que mi cliente esté configurado de una manera que conduzca a la configuración que necesita la cadena (puede ser heredada de un sistema operativo o configuración regional de Java, por ejemplo):

alter session set NLS_NUMERIC_CHARACTERS = ',.';
select to_number('100,12') from dual;

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

En SQL Developer, puede establecer su valor preferido en Herramienta->Preferencias->Base de datos->NLS.

Pero también puedo anular esa configuración de sesión como parte de la consulta, con el tercer nlsparam opcional. parámetro a to_number(); aunque eso hace que el segundo fmt sea opcional parámetro necesario también, por lo que deberá poder elegir un formato adecuado:

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 

De forma predeterminada, el resultado aún se muestra con la configuración de mi sesión, por lo que el separador decimal sigue siendo un punto.