在ORACLE存储过程中格式化数字的正确方法。
我需要显示2个小数的货币字段。预期输出如下:
下面为我工作:
select to_char(9876.23 , 'fm999990.00') from dual;
但这存在硬编码一堆9的问题。如果我提供更大的数字,它将显示为“ ###############”
我还有其他方法可以做到这一点吗?
我需要显示2位小数的货币字段。
确保使用数字数据类型,并且其缩放比例和精度适合于数据,而不要使用NUMBER没有缩放比例和精度的数字数据类型。如果您要存储美元/欧元/英镑/等。那么2014年世界生产总值(Gross World Product)约为1亿亿美元。假设您处理的金额不会超过此[需要的引文],那么您的货币栏可以是:
NUMBER
NUMBER(17,2)
如果获得的值大于该值,则需要对数据进行完整性检查,并考虑大于世界总产值的数量是否有意义。如果要以日元或津巴布韦美元等形式存储值,请适当调整比例。
您甚至可以将包中的子类型定义为:
CREATE PACKAGE currencies_pkg IS SUBTYPE currency_type IS NUMBER(17,2); FUNCTION formatCurrency( amount IN CURRENCY_TYPE ) RETURN VARCHAR2; END; /
您用于格式化的代码可以是:
CREATE PACKAGE BODY currencies_pkg IS FUNCTION formatCurrency( amount IN CURRENCY_TYPE ) RETURN VARCHAR2 IS BEGIN RETURN TO_CHAR( currency_value, 'FM999999999999990D00' ); END; END; /
Then if you reference that sub-type in your stored procedures/packages you will not be able to exceed the maximum size of the currency data type without an exception being raised. The format model for displaying the value only needs to be defined in a single place and since the input is limited to the currency sub-type, then the formatting function will never exceed the imposed scale/precision and cannot output #s.
#
CREATE PROCEDURE your_procedure( in_value1 IN ACCOUNTS_TABLE.ACCOUNT_BALANCE%TYPE, in_value2 IN ACCOUNTS_TABLE.ACCOUNT_BALANCE%TYPE ) IS v_value CURRENCIES_PKG.CURRENCY_TYPE; BEGIN -- Do something v_value := in_value1 + in_value2; -- Output formatted value DBMS_OUTPUT.PUT_LINE( CURRENCIES_PKG.formatCurrency( v_value ) ); END; /