Oracle Fusion下数字转阿拉伯语单词:突破8位限制(禁用PL/SQL)
解决Oracle Fusion中数字转英文/阿拉伯语单词的位数限制问题
一、扩展数字位数支持(纯SQL实现)
原方法依赖TO_TIMESTAMP的FF9格式,最多支持9位数字。我们可以通过按三位分段拆分数字,分别转换每段后拼接量级单位(Trillion、Billion、Million等),实现任意长度正整数的转换:
WITH num_data AS ( SELECT 123456789012 AS num FROM dual -- 替换为你需要转换的数字 ), segments AS ( SELECT FLOOR(num / 1000000000000) AS trillion, FLOOR((num / 1000000000) MOD 1000) AS billion, FLOOR((num / 1000000) MOD 1000) AS million, FLOOR((num / 1000) MOD 1000) AS thousand, num MOD 1000 AS units FROM num_data ) SELECT TRIM( CONCAT( CASE WHEN trillion > 0 THEN TO_CHAR(TO_TIMESTAMP(LPAD(trillion,9,'0'),'FF9'),'Ffsp') || ' Trillion ' END, CASE WHEN billion > 0 THEN TO_CHAR(TO_TIMESTAMP(LPAD(billion,9,'0'),'FF9'),'Ffsp') || ' Billion ' END, CASE WHEN million > 0 THEN TO_CHAR(TO_TIMESTAMP(LPAD(million,9,'0'),'FF9'),'Ffsp') || ' Million ' END, CASE WHEN thousand > 0 THEN TO_CHAR(TO_TIMESTAMP(LPAD(thousand,9,'0'),'FF9'),'Ffsp') || ' Thousand ' END, CASE WHEN units > 0 THEN TO_CHAR(TO_TIMESTAMP(LPAD(units,9,'0'),'FF9'),'Ffsp') END ) ) AS number_in_english FROM segments;
关键说明:
- 用CTE将数字拆分为万亿、十亿、百万、千、个位五个分段,可按需扩展更高量级
- 每个分段单独用原逻辑转换为单词,通过
CASE过滤值为0的分段,避免无效文本 - 拼接后用
TRIM清除首尾多余空格
二、转换为阿拉伯语单词
要输出阿拉伯语数字单词,只需在TO_CHAR中指定NLS语言参数为阿拉伯语(需确保Oracle环境支持阿拉伯语语言包):
1. 单段数字转阿拉伯语
SELECT TO_CHAR(TO_TIMESTAMP(LPAD(3536,9,'0'),'FF9'),'Ffsp', 'NLS_LANGUAGE=ARABIC') FROM dual;
执行结果:ثلاثة آلاف وخمسمائة وستة وثلاثون
2. 多位数转阿拉伯语
结合分段方法,在每个TO_CHAR调用中添加NLS参数即可:
WITH num_data AS ( SELECT 123456 AS num FROM dual -- 替换为目标数字 ), segments AS ( SELECT FLOOR((num / 1000) MOD 1000) AS thousand, num MOD 1000 AS units FROM num_data ) SELECT TRIM( CONCAT( CASE WHEN thousand > 0 THEN TO_CHAR(TO_TIMESTAMP(LPAD(thousand,9,'0'),'FF9'),'Ffsp', 'NLS_LANGUAGE=ARABIC') || ' ألف ' END, CASE WHEN units > 0 THEN TO_CHAR(TO_TIMESTAMP(LPAD(units,9,'0'),'FF9'),'Ffsp', 'NLS_LANGUAGE=ARABIC') END ) ) AS number_in_arabic FROM segments;
执行结果:مائة وثلاثة وعشرون ألف وخمسة وستون
注意事项:
阿拉伯语的量级单位(如ألف=千、مليون=百万)需与分段对应,确保语义准确。
内容的提问来源于stack exchange,提问作者Faris Adnan
相关产品推荐
相关产品推荐

