我有一个数据库设置在一个测试机器和第二个在生产机器。当我跑步时:
select to_number('100,12') from dual
在此基础上给出了测试机的误差。然而,这一说法在生产机器上工作得很好。
现在,当我检查NLS_NUMERIC_CHARACTERS时,我会在两台机器中看到',‘(逗号)。还有别的地方我应该去找十进制设置吗?
干杯!
发布于 2014-07-04 10:18:27
通过查询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中,可以在工具->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
默认情况下,结果仍然用我的会话设置显示,所以十进制分隔符仍然是句号。
发布于 2018-01-04 11:07:55
Jaanna,Oracle中的会话参数依赖于客户端计算机,而PL/SQL上的NLS参数来自服务器。
例如,客户端计算机上的NLS_NUMERIC_CHARACTERS
可以是',.‘当它在服务器上的时候。
因此,当您从PL/SQL和Oracle运行脚本时,对于同一个脚本,十进制分隔符可能完全不同,除非您更改了脚本中预期的NLS_NUMERIC_CHARACTERS
会话。
测试会话参数的一种方法是这样做:
select to_number(5/2) from dual;
发布于 2018-09-05 12:27:15
若要了解会话十进制分隔符,可以使用以下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命令使用(默认情况下)在会话级别定义的0.5
NLS_NUMERIC_CHARACTERS将IMPLICITELY rational数字转换为字符串。
这两个命令返回相同的值。
我已经在PL/SQL脚本中测试了相同的SQL命令,这始终是显示的值、逗号或点。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
,如果小数分隔符是点,则返回0.5
。
https://stackoverflow.com/questions/24571355
复制相似问题