Solución:
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, sus errores de consulta:
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 lleve a la configuración que necesita la cadena (puede heredarse de un sistema operativo o de una 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 la tercera opción opcional nlsparam parámetro a to_number()
; aunque eso hace que el segundo opcional fmt 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 todavía se muestra con la configuración de mi sesión, por lo que el separador decimal sigue siendo un punto.
Jaanna, los sesión parámetros en Desarrollador Oracle SQL dependen de su computadora cliente, mientras que NLS parámetros en PL / SQL es del servidor.
Por ejemplo el NLS_NUMERIC_CHARACTERS
en la computadora cliente puede ser ‘,.‘mientras es’.,‘en el servidor.
Entonces, cuando ejecuta un script desde PL / SQL y Desarrollador Oracle SQL el separador decimal puede ser completamente diferente para el mismo script, a menos que altere la sesión con su esperado NLS_NUMERIC_CHARACTERS
en el guión.
Una forma de probar fácilmente el parámetro de su sesión es hacer:
select to_number(5/2) from dual;