如何使用correclty TO_NUMBER()Oracle函数考虑在数据库服务器上定义的NLS_NUMERIC_CHARACTERS?

问题描述 投票:1回答:2

今天,我发现Oracle qazxsw poi的含义模糊不清!

实际上,从开始,我认为NLS_NUMERIC_CHARACTERS仅用于定义十进制数字的显示方式。

但实际上,qazxsw poi也在qazxsw poi函数中隐式使用来定义要转换的STRING数字的格式。

我的问题是我是欧洲人,对我来说,小数分隔符实际上是一个逗号(,)而不是一个点(。)。

当我显示一个数字时,我的偏好是使用逗号显示它。因此NLS_NUMERIC_CHARACTERS设置为NLS_NUMERIC_CHARACTERS,其中第一个字符定义数字分隔符。

到现在为止,我没有问题:-)

我的问题是所有包含数字的TO_NUMBER()表的字段值都使用POINT字符作为小数分隔符。

当我将转换表示数字的任何字符串值时,我可以像这样使用TO_NUMBER Oracle函数

NLS_NUMERIC_CHARACTERS

如果小数点分隔符是一个POINT(',.'),这可以正常工作,但如果小数点分隔符是COMMA(String),则此停止工作。

我知道我可以像这样在select TO_NUMBER(VALUE) from TB_PARAMETER; 函数中指定NLS_NUMERIC_CHARACTERS = '.,'

NLS_NUMERIC_CHARACTERS = ',.'

但这对我来说是冗长的!

有没有Oracle功能做同样的事情?

例:

NLS_NUMERIC_CHARACTERS

Personnaly,我认为Oracle TO_NUMBER()函数使用select TO_NUMBER(VALUE ,'999999999D999999999' ,'NLS_NUMERIC_CHARACTERS = ''.,''' ) from TB_PARAMETER; 会话的参数来定义要转换的十进制字符串的格式是一个错误。

实际上,在数据库中,字符串中使用的小数分隔符始终是固定的。这是一个逗号或一个点,但从来没有,一次是逗号而另一次是一个点。

如果我的分析是正确的,select CAST_NUMBER(VALUE) from TB_PARAMETER; 函数必须始终使用一个固定值,即POINT或COMMA,它们(在所有情况下)都不对应于NLS_NUMERIC_CHARACTERS,因为此参数具有会话范围并由Oracle客户端应用程序定义。

在简历中,当您使用TO_NUMBER()函数而未在Oracle视图中指定任何NLS_NUMERIC_CHARACTERS时,您的视图将正常工作,直到它在具有另一个不同TO_NUMBER()值的会话中执行为止!

当您尝试使用Oracle TO_NUMBER()函数转换保存为字符串的DATE值时,确实存在同样的事情!

为什么它含糊不清!

为了回答评论中的一些问题,我在以下段落中添加了我的长篇解释。

在会话级别或系统级别更改NLS_NUMERIC_CHARACTERS并非总是可行,因为NLS_NUMERIC_CHARACTERS具有2个不同的角色或目标。

  1. 固定十进制分隔符显示十进制数
  2. 修复用于在TO_NUMBER()函数中转换字符串的小数分隔符

示例:假设您将创建一个显示十进制数的视图,并使用TO_NUMBER()进行一些计算。

如果保存在数据库中的十进制分隔符为POINT,并且如果必须使用COMMA作为十进制分隔符显示十进制数,则可以更改NLS_NUMERIC_CHARACTERS以将小数分隔符定义为POINT。 Oracle TO_NUMBER()函数将正常工作,但屏幕上显示的十进制数字将以POINT作为小数分隔符显示!

这就是为什么我说NLS_NUMERIC_CHARACTERS是不明确的。

在简历中,在NLS_NUMERIC_CHARACTERS可以是'。,'或','的数据库系统中。 AND使用固定格式可以在Oracle表中保存十进制数(例如:小数分隔符为POINT),使用TO_NUMBER()而不指定正确的NLS_NUMERIC_CHARACTERS是不安全的。

Oracle错误(或者如果您愿意,可能是误解)是定义了一个具有2个不同角色的参数(NLS_NUMERIC_CHARACTERS)!

oracle function internationalization nls
2个回答
3
投票

那么,从我的观点来看,最好的选择是在NLS_NUMERIC_CHARACTERS数据类型列中保留数字。你将如何将NLS_NUMERIC_CHARACTERS应用于TO_DATE()

除此之外,我认为你已经发现的东西(应用NUMBER)是你可以做的,除了使用TO_NUMBER并在所有字符串值中将所有点转换为逗号。


1
投票

有关信息,我创建了跟随功能

value = '32.5rzg'

和同义词

NLS_NUMERIC_CHARACTERS

我现在可以从另一个模式中使用它,如下例所示:

REPLACE
© www.soinside.com 2019 - 2024. All rights reserved.