首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >十进制的NLS_NUMERIC_CHARACTERS设置

十进制的NLS_NUMERIC_CHARACTERS设置
EN

Stack Overflow用户
提问于 2014-07-04 09:44:42
回答 4查看 163.1K关注 0票数 22

我有一个数据库设置在一个测试机器和第二个在生产机器。当我跑步时:

代码语言:javascript
运行
复制
select to_number('100,12') from dual 

在此基础上给出了测试机的误差。然而,这一说法在生产机器上工作得很好。

现在,当我检查NLS_NUMERIC_CHARACTERS时,我会在两台机器中看到',‘(逗号)。还有别的地方我应该去找十进制设置吗?

干杯!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-07-04 10:18:27

通过查询nls_session_parameters,可以查看当前会话设置。

代码语言:javascript
运行
复制
select value
from nls_session_parameters
where parameter = 'NLS_NUMERIC_CHARACTERS';

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

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

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

代码语言:javascript
运行
复制
select to_number('100,12') from dual;

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

我可以直接用alter session修改我的会话,或者确保我的客户端配置的方式导致了字符串需求的设置(例如,它可以从操作系统或Java继承):

代码语言:javascript
运行
复制
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参数也是必要的,所以您需要能够选择合适的格式:

代码语言:javascript
运行
复制
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 

默认情况下,结果仍然用我的会话设置显示,所以十进制分隔符仍然是句号。

票数 50
EN

Stack Overflow用户

发布于 2018-01-04 11:07:55

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

例如,客户端计算机上的NLS_NUMERIC_CHARACTERS可以是',.‘当它在服务器上的时候。

因此,当您从PL/SQL和Oracle运行脚本时,对于同一个脚本,十进制分隔符可能完全不同,除非您更改了脚本中预期的NLS_NUMERIC_CHARACTERS会话。

测试会话参数的一种方法是这样做:

代码语言:javascript
运行
复制
select to_number(5/2) from dual;
票数 3
EN

Stack Overflow用户

发布于 2018-09-05 12:27:15

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

代码语言:javascript
运行
复制
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命令:

代码语言:javascript
运行
复制
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;
/

要知道十进制分隔符的较短的命令是:

代码语言:javascript
运行
复制
SELECT .5 FROM DUAL;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24571355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档