NLS_NUMERIC_CHARACTERS设置为十进制

时间:2014-07-04 09:44:43

标签: oracle oracle11g oracle-sqldeveloper

我在测试机器中有一个数据库设置,在生产机器中有第二个数据库设置。我跑的时候:

select to_number('100,12') from dual 

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

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

干杯!

4 个答案:

答案 0 :(得分:31)

您可以通过查询nls_session_parameters

来查看当前的会话设置
select value
from nls_session_parameters
where parameter = 'NLS_NUMERIC_CHARACTERS';

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

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

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

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

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

我可以直接使用alter session或确保我的客户端以导致设置字符串需要的方式配置(可以从操作系统或Java语言环境继承)来改变我的会话):

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

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

在SQL Developer中,您可以在Tool-> Preferences-> Database-> 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 

默认情况下,结果仍会显示我的会话设置,因此小数点分隔符仍为句点。

答案 1 :(得分:2)

Jaanna Oracle SQL Developer 中的会话参数取决于您的客户端计算机,而 NLS PL / SQL 上的参数来自服务器。

例如,客户端计算机上的NLS_NUMERIC_CHARACTERS可以是' ,。'而它是' 。,'在服务器上。

因此,当您从 PL / SQL Oracle SQL Developer 运行脚本时,相同脚本的小数点分隔符可能完全不同,除非您使用预期的{更改会话脚本中的{1}}。

轻松测试会话参数的一种方法是:

NLS_NUMERIC_CHARACTERS

答案 2 :(得分:0)

要了解SESSION十进制分隔符,可以使用以下SQL命令:

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ', ';

select SUBSTR(value,1,1) as "SEPARATOR"
      ,'using NLS-PARAMETER' as "Explanation"
  from nls_session_parameters
  where parameter = 'NLS_NUMERIC_CHARACTERS'

UNION ALL

select SUBSTR(0.5,1,1) as "SEPARATOR" 
      ,'using NUMBER IMPLICIT CASTING' as "Explanation"
  from DUAL;

第一个SELECT命令查找NLS_SESSION_PARAMETERS表中定义的NLS参数。小数点分隔符是返回值的第一个字符。

第二个SELECT命令使用(默认情况下)在会话级定义的NLS_NUMERIC_CHARACTERS将0.5有理数隐式转换为字符串。

两个命令返回相同的值。

我已经在PL / SQL脚本中测试了相同的SQL命令,并且始终显示相同的值COMMA或POINT。 PL / SQL脚本中显示的小数分隔符等于SQL中显示的十进制分隔符。

为了测试我所说的内容,我使用了以下SQL命令:

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ', ';

select 'DECIMAL-SEPARATOR on CLIENT: (' || TO_CHAR(.5,) || ')' from dual;

DECLARE
    S VARCHAR2(10) := '?';
BEGIN

    select .5 INTO S from dual;

    DBMS_OUTPUT.PUT_LINE('DECIMAL-SEPARATOR in PL/SQL: (' || S || ')');
END;
/

了解小数点分隔符的简短命令是:

SELECT .5 FROM DUAL;

如果小数点分隔符是逗号,则返回0,5,如果小数点分隔符是POINT,则返回0.5

答案 3 :(得分:0)

最好的方法是

SELECT to_number(replace(:Str,',','')/100) --into num2 
FROM dual;