NLS_NUMERIC_CHARACTERS设置为十进制

Jaa*_*nna 15 oracle oracle11g oracle-sqldeveloper

我在测试机器中有一个数据库设置,在生产机器中有第二个.当我跑:

select to_number('100,12') from dual 
Run Code Online (Sandbox Code Playgroud)

然后它在测试机器中出错.但是,这种说法在生产机器中运行得很好.

现在,当我检查NLS_NUMERIC_CHARACTERS时,我在两台机器上都看到','(逗号).还有其他地方我应该寻找小数设置吗?

干杯!

Ale*_*ole 35

您可以通过查询来查看当前的会话设置nls_session_parameters:

select value
from nls_session_parameters
where parameter = 'NLS_NUMERIC_CHARACTERS';

VALUE                                  
----------------------------------------
.,                                       
Run Code Online (Sandbox Code Playgroud)

这可能与数据库默认值不同,您可以在其中看到nls_database_parameters.

在此会话中您的查询错误:

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

Error report -
SQL Error: ORA-01722: invalid number
01722. 00000 -  "invalid number"
Run Code Online (Sandbox Code Playgroud)

我可以直接改变我的会话,alter session或者通过确保我的客户端以一种导致设置字符串需要的方式进行配置(例如,它可以从操作系统或Java语言环境继承):

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

TO_NUMBER('100,12')
-------------------
             100,12 
Run Code Online (Sandbox Code Playgroud)

在SQL Developer中,您可以在工具 - >首选项 - >数据库 - > NLS中设置首选值.

但我也可以将该会话设置覆盖为查询的一部分,并使用可选的第三个nlsparam参数to_number(); 虽然这使得可选的第二个fmt参数也是必需的,但您需要能够选择合适的格式:

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 
Run Code Online (Sandbox Code Playgroud)

默认情况下,结果仍然显示在我的会话设置中,因此小数点分隔符仍然是句点.