如何在非美国语言环境中使用 Oracle 中的 to_number 函数?

How to use to_number function in Oracle for non US locales?

我有数字 123.45,但在葡萄牙语中,这实际上是 Oracle 当前在我们的环境中使用的语言环境,这个数字应该是 123,45,所以当我尝试 运行

SELECT TO_NUMBER('123.45') FROM DUAL;

我收到 ORA-06512 错误。

用逗号替换点不是一个选项,因为除了看起来是一个 hacky 解决方案之外,oracle 驱动程序考虑了我的 java 应用程序区域设置并将其传递给 Oracle 数据库会话。

在这个函数中是否可以同时考虑点和逗号作为小数点分隔符?

您可以根据您的数据库版本尝试REFEXP、REPLACE 函数。有概念是 repalce 。 ,希望这会有所帮助。

https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm

https://www.techonthenet.com/oracle/functions/regexp_replace.php

使用作为 TO_NUMBER 的第二个参数传递的 D 格式模型来表示会话当前十进制字符:

其中,如果你在 America/England/etc。那么你可以使用:

SELECT TO_NUMBER('123.45', '999D99') FROM DUAL;

并在 Portugal/Germany/etc.

SELECT TO_NUMBER('123,45', '999D99') FROM DUAL;

如果您想始终使用 .,则在格式模型中明确使用 .

SELECT TO_NUMBER('123.45', '999.99') FROM DUAL;

或指定要用作 TO_NUMBER 函数的第三个参数的 NLS_NUMERIC_CHARACTERS 设置:

SELECT TO_NUMBER('123.45', '999D99', 'NLS_NUMERIC_CHARACTERS=''.,''') AS value FROM DUAL;

db<>fiddle here