今天,我发现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个不同的角色或目标。
示例:假设您将创建一个显示十进制数的视图,并使用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)!
那么,从我的观点来看,最好的选择是在NLS_NUMERIC_CHARACTERS
数据类型列中保留数字。你将如何将NLS_NUMERIC_CHARACTERS
应用于TO_DATE()
?
除此之外,我认为你已经发现的东西(应用NUMBER
)是你可以做的,除了使用TO_NUMBER
并在所有字符串值中将所有点转换为逗号。
有关信息,我创建了跟随功能
value = '32.5rzg'
和同义词
NLS_NUMERIC_CHARACTERS
我现在可以从另一个模式中使用它,如下例所示:
REPLACE