我在测试机器中有一个数据库设置,在生产机器中有第二个数据库设置。我跑的时候:
select to_number('100,12') from dual
然后它在测试机器中出错。但是,这种说法在生产机器上运行得很好。
现在,当我检查NLS_NUMERIC_CHARACTERS时,我看到',' (逗号)在两台机器上。还有其他地方我应该寻找小数设置吗?
干杯!
答案 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;