CREATE OR REPLACE FUNCTION "F_UPPER_MONEY_NEW"(I_NUM  in number default null                                )
return nvarchar2 is
/*
处理数字金额转换为汉字表达
--情况1.保留元角分  (默认)  10240035001421.1  //壹拾万贰仟肆佰亿参仟伍佰万壹仟肆佰贰拾壹元壹角零分
--情况2.情况1上调整角分没有则不保留
--情况3.单位全保留 (包含substr中所有)
样例1 130034000600.04   壹仟参佰亿参仟肆佰万陆佰元零角肆分
*/
Result     varchar2(100); --返回字符串
V_TEMNUM   varchar2(100); --四舍五入到小数点后2位并去除小数点
v_str1s    varchar2(36) := ‘零壹贰参肆伍陆柒捌玖‘; --数字汉字表示
v_str2s    varchar2(50) := ‘分角元拾佰仟万拾佰仟亿拾佰仟万拾佰仟‘; --数字单位
V_STR_N    VARCHAR2(3):=‘‘;
v_num      number := 1; --计数
v_len      number; --长度
v_str1     varchar2(3); --中文单数字字符
v_str2     varchar2(3); --单位
v_numround varchar2(3);    --
v_errmsg   varchar2(200);   --错误消息
begin
-- 为空返回空值
if I_NUM is null then
return null;
end if;
--格式化输入参数
IF I_NUM<0 THEN
V_STR_N:=‘负‘;
END IF;
V_TEMNUM := round(I_NUM, 2) * 100;
v_len := length(V_TEMNUM);
while 0 < v_len loop
v_numround := substr(V_TEMNUM, v_len, 1);
v_str1     := substr(v_str1s, v_numround + 1, 1);
v_str2     := substr(v_str2s, v_num, 1);
--处理特殊情况   (情况3不需要处理特殊情况)
IF v_str1 = ‘零‘ AND v_num >= 3 THEN       --v_num>=3 去除支持情况2
IF V_STR2 IN (‘仟‘, ‘佰‘, ‘拾‘) THEN
IF SUBSTR(Result,1,1) IN (‘零‘,‘元‘,‘万‘,‘亿‘) THEN
v_str1 := ‘‘;
v_str2 := ‘‘;
ELSE
v_str1 := ‘零‘;
v_str2 := ‘‘;
END IF;
ELSIF V_STR2 IN (‘亿‘, ‘万‘, ‘元‘) THEN
V_STR1 := ‘‘;
END IF;
END IF;
Result := v_str1 || v_str2 || Result;
v_len  := v_len - 1;
v_num  := v_num + 1;
end loop;
return V_STR_N||Result;
exception
when others then
--实际应用返回根据情况调整
v_errmsg:=substr(sqlerrm,1,200);
--return ‘‘;
raise_application_error(1000,v_errmsg);
end F_UPPER_MONEY_NEW;
原文:https://www.cnblogs.com/ZwyBky/p/14125308.html