暂无图片
求金额转大写的PL/SQL function
我来答
分享
暂无图片 匿名用户
求金额转大写的PL/SQL function
暂无图片 25M

求一个Oracle版的金额转大写的PL/SQL function,要靠谱的,网上找了几个有点问题

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
伟鹏

创建语句如下:

CREATE OR REPLACE FUNCTION amount_to_words(p_amount NUMBER) RETURN VARCHAR2 IS
v_amount NUMBER := TRUNC(p_amount);
v_decimals NUMBER := ROUND((p_amount - v_amount) * 100);
v_result VARCHAR2(1000);
v_units VARCHAR2(10) := '零壹贰叁肆伍陆柒捌玖';
v_scale VARCHAR2(10) := '拾佰仟';
v_decimals_word VARCHAR2(20) := '角分';
v_integer_word VARCHAR2(20) := '元整';
BEGIN
IF v_amount = 0 THEN
v_result := '零' || v_integer_word;
ELSE
WHILE v_amount > 0 LOOP
v_result := SUBSTR(v_units, MOD(v_amount, 10) + 1, 1) || v_result; -- 个位数转换
v_amount := FLOOR(v_amount / 10);
v_result := SUBSTR(v_scale, LENGTH(v_scale) - LENGTH(v_result) + 1, 1) || v_result; -- 十百千位数转换
END LOOP;
v_result := v_result || v_integer_word;

IF v_decimals > 0 THEN
v_result := v_result || SUBSTR(v_units, MOD(v_decimals, 10) + 1, 1) || SUBSTR(v_decimals_word, 1, 1);
v_result := v_result || SUBSTR(v_units, TRUNC(v_decimals / 10) + 1, 1) || SUBSTR(v_decimals_word, 2, 1);
END IF;
END IF;

RETURN v_result;
END;
/


验证:

SELECT amount_to_words(1234.56) AS amount_words FROM DUAL;

结果:

AMOUNT_WORDS ----------------------------------- 

壹仟贰佰叁拾肆元伍角陆分

暂无图片 评论
暂无图片 有用 1
打赏 0
霸王龙的日常

代码中包含了边界异常情况和错误处理。

CREATE OR REPLACE FUNCTION amount_to_chinese(num_amount IN NUMBER) RETURN VARCHAR2 IS
    v_chinese_number VARCHAR2(100);
    v_integer_part NUMBER;
    v_decimal_part NUMBER;
    v_integer_part_chinese VARCHAR2(100);
    v_decimal_part_chinese VARCHAR2(20);
    v_result VARCHAR2(200);
BEGIN
    IF num_amount < 0 THEN
        RAISE_APPLICATION_ERROR(-20001, '金额不能为负数。');
    END IF;
    
    -- 分离整数和小数部分
    v_integer_part := FLOOR(num_amount);
    v_decimal_part := ROUND((num_amount - v_integer_part) * 100);
    
    -- 处理整数部分
    v_integer_part_chinese := TO_CHAR(v_integer_part);
    v_integer_part_chinese := REPLACE(v_integer_part_chinese, '1', '壹');
    v_integer_part_chinese := REPLACE(v_integer_part_chinese, '2', '贰');
    v_integer_part_chinese := REPLACE(v_integer_part_chinese, '3', '叁');
    v_integer_part_chinese := REPLACE(v_integer_part_chinese, '4', '肆');
    v_integer_part_chinese := REPLACE(v_integer_part_chinese, '5', '伍');
    v_integer_part_chinese := REPLACE(v_integer_part_chinese, '6', '陆');
    v_integer_part_chinese := REPLACE(v_integer_part_chinese, '7', '柒');
    v_integer_part_chinese := REPLACE(v_integer_part_chinese, '8', '捌');
    v_integer_part_chinese := REPLACE(v_integer_part_chinese, '9', '玖');
    
    -- 处理小数部分
    IF v_decimal_part > 0 THEN
        v_decimal_part_chinese := TO_CHAR(v_decimal_part);
        IF LENGTH(v_decimal_part_chinese) = 1 THEN
            v_decimal_part_chinese := '零' || v_decimal_part_chinese;
        END IF;
        v_decimal_part_chinese := SUBSTR(v_decimal_part_chinese, 1, 1) || '角' || SUBSTR(v_decimal_part_chinese, 2) || '分';
    ELSE
        v_decimal_part_chinese := '整';
    END IF;
    
    -- 拼接结果
    v_result := v_integer_part_chinese || '元' || v_decimal_part_chinese;
    
    RETURN v_result;
EXCEPTION
    WHEN OTHERS THEN
        RAISE_APPLICATION_ERROR(-20002, '金额转换为中文大写时发生错误。');
END;
/
复制

测试:

select amount_to_chinese(XXX) from dual;
复制
暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
Oracle最常用的索引结构是什么?怎样使用索引?
回答 5
已采纳
BTree索引是目前为止Oracle数据库中最常用也是用最了解的索引结构。它是个非常优秀的通用索引机制,在访问时间方面可扩展性非常好,从一个1000行的索引与一个100000行的索引中取出数据的时间几
Oracle 中 list类型的分区可以改为自增长的吗 ?
回答 1
已采纳
你说的自增长应该是间隔分区。但间隔分区并不能直接支持list类型,你可以考虑通过表中的时间字段与你目前的list字段来联合创建一个间隔分区://创建间隔哈希分区partitionbyrange(joi
SOA套件JMS消息中间件文件锁定问题如何解锁?
回答 1
lsof查看哪个进程在使用该文件,然后kill进程就可以了
Oracle 10046和10053两个事件有啥区别?都在什么时候用?
回答 1
已采纳
当一个SQL出现性能问题的时候,可以使用SQLTRACE或者10046事件来跟踪SQL.通过生成的trace来了解SQL的执行过程。我们在查看一条SQL的执行计划的时候,只能看到CBO最终告诉我们的执
请教一下 这个是Oracle的bug吗 ? Oracle11g
回答 1
IssuingthisSQLasSYS(SYSDBA)mayhelpshowanyproblemobjectsinthedictionary:可以检查下,有可能是BUGORA600[17059](文档
Oracle imp全导入有什么需要注意的吗?
回答 1
一般不建议全导入,最好针对schame级别导入,要哪个用户数据就导入哪个,全库导入把系统用户对象都导会报错一大堆,排查起来费事。
除了crsctl命令,还有哪些工具可以管理Oracle集群资源?
回答 1
已采纳
‌olsnodes‌:这是一个节点查看工具,用于显示集群节点的信息,包括节点编号、私有互联名称、虚拟IP名称等‌。‌oifcfg‌:用于定义和修改Oracle集群所需的网卡属性,包括网卡的网段地址、子
oracle rac 使用不同大小的盘 有性能问题吗 各位老大?
回答 2
已采纳
是否有性能影响,是要看磁盘io的组织形式1)阵列形式,如果是阵列已经在io层面做过优化,即条带化,分派出来的逻辑磁盘大小是跨多个物理磁盘的,可以使用尺寸稍大的,建议别超过1t2、如果本次磁盘,不建议使
大家知道这个路径下的log. xml可以定期删除吗?我正式系统listener.log达到8G,服务都还正常,测试系统listener.log达到4G,忘了搞定期删除,结果测试环境监听挂了
回答 5
已采纳
19c前增加crontab.19c后可自动1,对于listenerxml的日志是可以使用adrci&gt;purgeage的方式删除2,对于listener.log格式的日志可以参考我之前的一个htt
Oracle PLSQL还有学习的必要吗?
回答 4
已采纳
PL/SQL是一种功能强大而又简便易用的数据库编程语言。它易于编写和理解,并且包含许多开箱即用的优化和安全功能。学习周期又不会很长,为何不呢?