强制将逗号作为脚本中的十进制分隔符,以便在Oracle数据库的任何本地化上运行

强制将逗号作为脚本中的十进制分隔符,以便在Oracle数据库的任何本地化上运行,oracle,Oracle,我想为数字转换设置一个格式掩码,以便无论会话中设置了什么,都能“始终”将逗号作为十进制分隔符。换句话说,我的目标是强制这种格式掩码始终在Oracle数据库的任何本地化中获胜 我的会议已经开始了 NLS_NUMERIC_CHARACTERS=',.' 当我发出这些命令时,我得到: SELECT TO_CHAR( 100.34,'fm099999999999999D00') FROM DUAL; 000000000000100,34 -- as desired SELECT TO_CHAR( 1

我想为数字转换设置一个格式掩码,以便无论会话中设置了什么,都能“始终”将逗号作为十进制分隔符。换句话说,我的目标是强制这种格式掩码始终在Oracle数据库的任何本地化中获胜

我的会议已经开始了

NLS_NUMERIC_CHARACTERS=',.'
当我发出这些命令时,我得到:

SELECT TO_CHAR( 100.34,'fm099999999999999D00') FROM DUAL;
000000000000100,34 -- as desired

SELECT TO_CHAR( 100.34,'fm099999999999999.00') FROM DUAL;
000000000000100,34 -- as desired

SELECT TO_CHAR( 100.34,'fm099999999999999,00') FROM DUAL;
000000000000001,00 -- NOT What I want!! because ',' is for thousands

有没有办法在不改变当前会话的情况下强制将“逗号”作为“十进制分隔符”?

使用第一个格式掩码,D表示十进制分隔符,然后将NLS\u数字\u字符作为最后一个显式参数传递给\u字符:

SQL> SELECT TO_CHAR( 100.34,'fm099999999999999D00') FROM DUAL;

TO_CHAR(100.34,'FM0
-------------------
000000000000100.34

1 row selected.

Elapsed: 00:00:00.15
SQL> SELECT TO_CHAR( 100.34,'fm099999999999999D00', 'NLS_NUMERIC_CHARACTERS = '',.''') FROM DUAL;

TO_CHAR(100.34,'FM0
-------------------
000000000000100,34

使用第一个格式掩码,D表示十进制分隔符,然后将NLS_NUMERIC_字符作为显式的最后一个参数传递给\u CHAR:

SQL> SELECT TO_CHAR( 100.34,'fm099999999999999D00') FROM DUAL;

TO_CHAR(100.34,'FM0
-------------------
000000000000100.34

1 row selected.

Elapsed: 00:00:00.15
SQL> SELECT TO_CHAR( 100.34,'fm099999999999999D00', 'NLS_NUMERIC_CHARACTERS = '',.''') FROM DUAL;

TO_CHAR(100.34,'FM0
-------------------
000000000000100,34

您第三次尝试的问题是,在2000000中,Oracle没有将其视为千位分隔符,而只是将其视为“组”分隔符。在印度(“lakh”)符号中,相同的数字是200000。不同的文化对数字进行不同的“分组”(对于整数!),所以Oracle将按照您的指示执行。与我的答案类似,如果您还需要对数字进行分组(根据任何掩码),您将使用G而不是显式,或。-然后专门传递NLS_NUMERIC_字符或使用会话默认值。第三次尝试中的问题是Oracle没有将2000000视为千位分隔符,而只是将其视为“组”分隔符。在印度(“lakh”)符号中,相同的数字是200000。不同的文化对数字进行不同的“分组”(对于整数!),所以Oracle将按照您的指示执行。与我的答案类似,如果您还需要对数字进行分组(根据任何掩码),您将使用G而不是显式,或。-然后专门传递NLS_数字_字符或使用会话默认值。