如何在Oracle SQL中将数字金额转换为英文单词?需实现批量转换函数
Oracle SQL 数字金额转英文表述实现方案
1. 单数字转换示例(以156为例)
使用自定义函数直接调用即可完成转换:
SELECT NUM_TO_ENGLISH(156) AS amount_in_english FROM DUAL;
执行结果:one hundred and fifty six
2. 批量转换用自定义函数
以下是适配Oracle SQL环境的PL/SQL函数,可接收数字参数并自动完成转换,支持批量处理需求:
CREATE OR REPLACE FUNCTION NUM_TO_ENGLISH(p_num IN NUMBER) RETURN VARCHAR2 IS v_num NUMBER := ABS(p_num); v_str VARCHAR2(1000) := ''; TYPE num_words IS TABLE OF VARCHAR2(20) INDEX BY PLS_INTEGER; v_units num_words; v_tens num_words; v_teens num_words; FUNCTION convert_three_digits(p_three_num IN NUMBER) RETURN VARCHAR2 IS v_hundreds NUMBER := TRUNC(p_three_num / 100); v_rest NUMBER := MOD(p_three_num, 100); v_result VARCHAR2(200) := ''; v_tens_part NUMBER; v_units_part NUMBER; BEGIN IF v_hundreds > 0 THEN v_result := v_units(v_hundreds) || ' hundred'; IF v_rest > 0 THEN v_result := v_result || ' and '; END IF; END IF; IF v_rest BETWEEN 11 AND 19 THEN v_result := v_result || v_teens(v_rest); ELSE v_tens_part := TRUNC(v_rest / 10); v_units_part := MOD(v_rest, 10); IF v_tens_part > 0 THEN v_result := v_result || v_tens(v_tens_part); IF v_units_part > 0 THEN v_result := v_result || ' '; END IF; END IF; IF v_units_part > 0 THEN v_result := v_result || v_units(v_units_part); END IF; END IF; RETURN TRIM(v_result); END convert_three_digits; BEGIN -- 初始化数字对应英文单词数组 v_units(1) := 'one'; v_units(2) := 'two'; v_units(3) := 'three'; v_units(4) := 'four'; v_units(5) := 'five'; v_units(6) := 'six'; v_units(7) := 'seven'; v_units(8) := 'eight'; v_units(9) := 'nine'; v_tens(2) := 'twenty'; v_tens(3) := 'thirty'; v_tens(4) := 'forty'; v_tens(5) := 'fifty'; v_tens(6) := 'sixty'; v_tens(7) := 'seventy'; v_tens(8) := 'eighty'; v_tens(9) := 'ninety'; v_teens(11) := 'eleven'; v_teens(12) := 'twelve'; v_teens(13) := 'thirteen'; v_teens(14) := 'fourteen'; v_teens(15) := 'fifteen'; v_teens(16) := 'sixteen'; v_teens(17) := 'seventeen'; v_teens(18) := 'eighteen'; v_teens(19) := 'nineteen'; -- 处理零的情况 IF v_num = 0 THEN RETURN 'zero'; END IF; -- 处理负数 IF p_num < 0 THEN v_str := 'negative '; END IF; -- 处理百万级(可根据需求扩展更大单位) IF v_num >= 1000000 THEN v_str := v_str || convert_three_digits(TRUNC(v_num / 1000000)) || ' million'; v_num := MOD(v_num, 1000000); IF v_num > 0 THEN v_str := v_str || ' '; END IF; END IF; -- 处理千级 IF v_num >= 1000 THEN v_str := v_str || convert_three_digits(TRUNC(v_num / 1000)) || ' thousand'; v_num := MOD(v_num, 1000); IF v_num > 0 THEN v_str := v_str || ' '; END IF; END IF; -- 处理剩余三位数 IF v_num > 0 THEN v_str := v_str || convert_three_digits(v_num); END IF; RETURN TRIM(v_str); EXCEPTION WHEN OTHERS THEN RETURN 'Invalid number'; END NUM_TO_ENGLISH; /
函数使用说明
- 参数:
p_num为需要转换的数字(支持正负整数) - 返回值:对应的英文表述字符串
- 批量处理示例:若要转换表中某列的所有数字,可直接在查询中调用:
SELECT amount, NUM_TO_ENGLISH(amount) AS amount_english FROM payment_table;
注意事项
- 函数默认支持整数转换,若需处理小数金额,可扩展函数逻辑拆分整数和小数部分分别转换
- 可根据业务需求扩展更大的数字单位(如十亿
billion)
内容的提问来源于stack exchange,提问作者idk_1808
相关产品推荐
相关产品推荐

