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

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

SELECT TO_NUMBER('123.45') FROM DUAL;

我收到 ORA-06512 错误。

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

无论如何在这个函数中将点和逗号都视为小数分隔符?

回答1

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

哪个,如果你在美国/英国/等。那么你可以使用:

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

在葡萄牙/德国/等地。

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<>小提琴https://dbfiddle.uk/?rdbms=oracle_21&fiddle=7500fbef3ddfd0336dd8349b7003504b

回答2

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

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

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

相似文章

sql - 识别连接非 19c 客户端的应用程序

我们已升级数据库以使用Oracle客户端19c。很少有应用程序正在访问我们的数据库以连接到他们的数据。我们想知道他们是否已将oracle客户端升级到19c或仍在使用12。我编写了一个SQL查询来捕获使...